2013-12-21 101 views
1

不停垃圾收集我在哪裏運行我的二維動畫,當系統GC被稱爲不已的一個問題,我不知道爲什麼。在2D動畫surfaceview

我讀過的所有內容都建議避免在onDraw()方法中創建位圖,但我仍然每秒調用一次GC,這嚴重影響了低端設備的可用性。

的代碼是很長,所以我不會在這裏張貼這一切,但基本上,有一個線程調用 _surfaceHolder.lockCanvas(null),然後postInvalidate,造成的onDraw()被調用,然後_surfaceHolder.unlockCanvasAndPost(_canvas)

我的onDraw()方法的_canvas.drawCircle(...)多次迭代,_canvas.drawBitmap(...)(繪製SurfaceView創建時所創建一次一個位圖),而且很多涉及Math.pow(...)數字計算的。該應用程序使用多個(10+)Double ArrayLists,它在每個onDraw()例程中讀寫數次。

任何人都可以闡明爲什麼被稱爲GC經常和我能做什麼來幫助一些輕?我是否只是計算太多,不應該期望更高的幀速率?

編輯:值得一提的是,當我註釋掉所有位圖和FPS隨着時間的推移不斷降低,時間越長,動畫已經運行了這個問題,即使仍然存在。

+0

你做過堆分析嗎?這裏有一篇不錯的博文:[Android應用程序的內存分析](http://android-developers.blogspot.co.nz/2011/03/memory-analysis-for-android.html) – tom

+0

感謝您的鏈接!運行堆分析後,我看到byte []數組佔用大量內存。即使我沒有將其繪製到畫布上,我仍然有一個我忘記的500x500px圖像。當我評論這條線時,我得到了更小的GC呼叫(但頻繁)。 – SJonesGSO

回答

1

我覺得你的問題是因爲使用雙的ArrayList的,你評。大雙是一個對象包裝,而是一個本地。無論何時在算術運算中將Double從Double切換到Double並反之亦然,都會生成大量垃圾,迫使GC開始收集大量會降低性能的微小對象。

在我的經驗,採用雙[],而不是ArrayList的< >可以提高性能顯著

希望它能幫助!

+0

我認爲你正在解決這個問題。當我刪除所有的位圖分配時(在進行內存分配分析之後),我仍然會頻繁地獲取GC調用,但是數量和時間要少得多,這讓我相信Double列表是導致頻率的原因,位圖大小是它需要的時間的來源。 – SJonesGSO