4

約 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 つの場所だけです。

4

2 に答える 2

2

Android API から正しく思い出すと、戻るボタンを押すことが必ずしも onDestroy() を意味するとは限りません。Android OS はガベージ コレクションを処理し、必要に応じて onDestroy() を呼び出します (たとえば、[戻る] ボタンを押した後にさらにアプリを起動した場合)。

ただし、戻るボタンを長押しすることでアプリを「強制終了」できる ROM がいくつかあります。

onStop() からテクスチャをアンロードして、レポートを返すことはできますか??

編集: Shark の返信が表示されませんでした。OnPause() も機能します -- 同じ概念... 実際、onPause() は常に OnStop() の前に呼び出されるため、より良い解決策になる可能性があります。

于 2012-12-29T23:45:05.473 に答える
2

ガベージ コレクターは未使用のオブジェクト メモリをすぐには解放しません。そのため、短い時間の後に新しいビットマップを再ロードしようとすると、そのために使用できる空きメモリがありません。

おそらく、WeakReference を使用する必要があります。JVM は、OutOfMemoryException をスローする前に WeakReference オブジェクトを解放する必要があります。例はここにあります: http://developer.android.com/training/displaying-bitmaps/display-bitmap.html

于 2012-12-30T00:09:59.810 に答える