2014-11-01 123 views
1

隨着堆的逐漸填滿,我在繼續我的遊戲超過8次後出現OutOfMemory錯誤。在使用MAT分析我的遊戲堆時,知道了以下2個原因:Android內存泄漏位圖

1)由「」加載的「android.graphics.Bitmap」的一個實例佔用6,554,944(35.34%)個字節。內存在由「」加載的「byte []」的一個實例中累積。 enter image description here

關鍵詞 android.graphics.Bitmap 字節[]

2)類 「android.content.res.Resources」,由 「」 裝,佔據6446248(34.76%)字節。內存在由「」加載的「java.lang.Object []」的一個實例中累積。 enter image description here

關鍵詞 java.lang.Object繼承[] android.content.res.Resources

請建議的決議

+0

做你的形象已經適用於每一個屏幕大小的一個世界?像mdpi,hdpi?或者,你是否在所有屏幕上使用了一張巨大的圖像? – 2014-11-01 08:01:36

+0

@BlazeTama快速之一..謝謝。我只有在hdpi文件夾中有3個活動屏幕的720p圖像,我使用顯示,我將它們解除綁定在onDestroy()上。對於遊戲中使用的圖像,我直接將它們稱爲R.drawable。*在我的渲染器 – David 2014-11-01 08:06:48

回答

0

嘗試回收的圖像,例如:

if(image!= null) { 
    ((BitmapDrawable)image.getDrawable()).getBitmap().recycle(); //here 
    image= (ImageView) view.findViewById(R.id.image); 
    image.setImageResource(yourresource); 
} 
else { 
    image= (ImageView) view.findViewById(R.id.image); 
    imageView.setImageResource(yourresource); 
} 
+0

中,我將嘗試此操作並返回給您。是否有可能像下面的字節[]緩衝區直接分配來保留空間'ByteBuffer bb = ByteBuffer.allocateDirect(4 * this.s.size()); bb.order(ByteOrder.nativeOrder()); this.vertexBuffer = bb.asFloatBuffer();'如果是的話,我該如何釋放這些? – David 2014-11-01 08:30:34

+0

@大衛對不起,我不知道緩衝區 – 2014-11-01 08:36:10

+0

我嘗試過你的解決方案。我確實似乎在工作,但在繼續進行遊戲多次後(即解決方案延遲了它),我仍然會收到同樣的錯誤。我想其他原因(原因2)也應該被修復以永久解決這個問題。任何想法如何? – David 2014-11-04 16:49:24

0

對於在遊戲中大量使用位圖(比如imageButtons等),確保你不會讓活動保持活躍狀態​​。

  1. 您可以在onPause/onResume中使用setImageDrawable(null)爲每個大項目播放加載/卸載遊戲。然後,您必須將每個簡歷中的繪圖放回到視圖中。如果你不做#3,這很好。

  2. 使用碎片是可能的,它解決了問題,因爲它們在您銷燬它們時卸載視圖。

  3. 如果您必須有活動,您可以在startActivity(myIntent)之後立即使用finish()。在這種情況下,您很可能需要重寫後退按鈕來控制導航,因爲您離開的活動不再位於後面的堆棧中。

對於ressources自己,你會讀到很多關於繪製-nodpi的東西,但如果你有編程的佈局和XML佈局adjustements的搭配,你要確保你有資產在所有可繪製的?dpi文件夾中,這對imageButton有很大不同。

此外,不要在代碼中使用setmaxheight,請使用layoutparams高度。這讓我在imageButton上不止一次地爲我記憶。

而且如果要加載的PNG到的意見在你的代碼,使用滑翔或畢加索和保存自己的傷害:)