2012-12-29 53 views
4

我正在使用大約900x600的5個大圖像進行遊戲。當我退出遊戲(按後退鍵),然後嘗試啓動遊戲,我得到以下錯誤:重新啓動應用程序時出現內存不足錯誤(Android)

12-29 15:59:16.633: E/AndroidRuntime(18642): FATAL EXCEPTION: GLThread 17 
12-29 15:59:16.633: E/AndroidRuntime(18642): java.lang.OutOfMemoryError: (Heap Size=20423KB, Allocated=3473KB, Bitmap Size=77KB) 
12-29 15:59:16.633: E/AndroidRuntime(18642): at org.andengine.opengl.util.GLHelper.getPixelsARGB_8888(GLHelper.java:165) 
12-29 15:59:16.633: E/AndroidRuntime(18642): at org.andengine.opengl.util.GLHelper.getPixels(GLHelper.java:41) 
12-29 15:59:16.633: E/AndroidRuntime(18642): at org.andengine.opengl.util.GLState.glTexImage2D(GLState.java:641) 
12-29 15:59:16.633: E/AndroidRuntime(18642): at org.andengine.opengl.texture.bitmap.BitmapTexture.writeTextureToHardware(BitmapTexture.java:120) 
12-29 15:59:16.633: E/AndroidRuntime(18642): at org.andengine.opengl.texture.Texture.loadToHardware(Texture.java:137) 
12-29 15:59:16.633: E/AndroidRuntime(18642): at org.andengine.opengl.texture.TextureManager.updateTextures(TextureManager.java:254) 
12-29 15:59:16.633: E/AndroidRuntime(18642): at org.andengine.engine.Engine.onDrawFrame(Engine.java:621) 
12-29 15:59:16.633: E/AndroidRuntime(18642): at org.andengine.opengl.view.EngineRenderer.onDrawFrame(EngineRenderer.java:105) 
12-29 15:59:16.633: E/AndroidRuntime(18642): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1363) 
12-29 15:59:16.633: E/AndroidRuntime(18642): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118) 

這實在是令人費解,因爲我卸下所有的紋理的應用程序被破壞之前。我知道這5個圖像導致錯誤,因爲當我跳過加載它們時,我沒有得到任何錯誤。爲了確保所有紋理都已卸載,我在裝入紋理後立即加載紋理。然後我退出並重新啓動遊戲,但收到了同樣的錯誤。紋理也沒有任何靜態引用。我還使用MAT來查看我在遊戲中使用了多少內存,並注意到我只使用了2.5MB,所以我不知道爲什麼錯誤是「堆大小= 20MB」。我已成功地解決了暫時的錯誤,唯一的辦法就是包括

system.exit(0); 

我知道我不應該使用的,但我完全沒了主意。

編輯:我確保紋理被卸載。我在遊戲中有一個按鈕,可以卸載所有的紋理。當我按下它時,所有的紋理都變成黑色,我假設卸載了紋理。卸載紋理時使用的一般方法僅僅是說

someTexture.unload(); 

這是一個andEngine方法。我不確定除此之外會發生什麼。編輯2:我加載一個名爲onCreateResources()的方法中的紋理,我卸載它們onDestroy()。那些是我操縱紋理的兩個地方。

+1

你確定紋理被釋放?你怎麼樣_裝載他們? –

+0

您正在使用不同的線程來處理圖像,您是否在創建新線程之前明確銷燬了舊線程? – Sam

+0

你使用Bitmap.recycle()嗎? :)另外,嘗試通過連續調用幾次來強制執行GC,或者使用cmdline參數增加堆大小-Xmx – Shark

回答

2

如果我從Android API正確記得: 按下後退按鈕並不一定意味着onDestroy()。 Android OS爲您打理garbarge集合,並在感覺需要時調用onDestroy()(例如,按下後退按鈕後啓動了更多應用程序)。

但是,有些ROM允許您通過長按後退按鈕來「殺死」應用程序。

你可以嘗試從onStop()卸載紋理並返回?

編輯:沒有看到鯊魚的答覆。 OnPause()也適用 - 相同的概念...事實上onPause()總是在OnStop()之前調用,所以它可能是一個更好的解決方案。

+0

我剛剛做了,仍然收到相同的錯誤。我也檢查:當我按回(通過logcat)時,onDestroy()確實被調用。 (還是)感謝你的建議。 – eBehbahani

2

垃圾收集器沒有立即釋放未使用的對象內存,因此如果您嘗試在短暫之後重新載入新的位圖,則沒有可用的內存用於此目的。

也許你應該使用WeakReference:在拋出OutOfMemoryException之前,JVM必須釋放WeakReference對象。一個例子可以在這裏找到:http://developer.android.com/training/displaying-bitmaps/display-bitmap.html

+0

這似乎很可能,但即使在我關閉應用程序後等待幾分鐘後,我仍然看到錯誤。 – eBehbahani

相關問題