我正在开发一款使用 5 个大约 900x600 的大图像的游戏。当我退出游戏(按后退按钮)然后尝试启动游戏时,出现以下错误:
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() 上卸载它们。这是我操纵纹理的唯一两个地方。
如果我没记错的话 Android API 是这样的:
按后退按钮并不一定意味着 onDestroy()。
Android 操作系统会为您处理垃圾收集,并在需要时调用 onDestroy() (例如,当您按后退按钮后启动了更多应用程序时)。
但是,有些 ROMS 允许您通过长按后退按钮来“杀死”应用程序。
您可以尝试从 onStop() 卸载纹理并报告回来吗?
编辑:没有看到鲨鱼的回复。 OnPause() 也可以工作——相同的概念...事实上 onPause() 总是在 OnStop() 之前调用,所以它可能是一个更好的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)