約 900x600 の 5 つの大きな画像を使用するゲームに取り組んでいます。ゲームを終了して (戻るボタンを押して) ゲームを起動しようとすると、次のエラーが表示されます。
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() をアンロードします。これらは、私がテクスチャを操作する 2 つの場所だけです。