最後の編集での解決策。
実際、ローエンドのデバイスでも発生しました (GT-S5830
およびGT-S5830i
)。
問題は、メモリ不足のために発生しなかったことです。ゲームの現在のメモリ使用量をログに記録しましたが、空き RAM が 80 メガバイト以上あるにもかかわらず、3 メガバイトを超えませんでした。私もSystem.gc()
一貫して実行しました。これは、ガベージコレクターが RAM スペースを解放することを示唆しています。
回避策はありませんが、見つけ次第この回答を更新します。
いくつかの検索の後、GPU 関連のもの (テクスチャなど) はガベージ コレクターによって管理されません (そのため、手動で破棄する必要があります)。だから、呼び出しSystem.gc()
はどういうわけか無意味です。それでも、すべてのテクスチャを破棄しており、ゲームのメモリ使用量はかなり少なくなっています。
私はあらゆる種類の解決策を試しましたが、何も機能しませんでしたが、問題を解決する必要があるものがあります(これは試していませんが、それでも機能するはずです):
あまりにも多くのテクスチャを何度もロードしないでください。私のゲームでは、ユーザーが画面から離れるたびに、すべてのテクスチャを破棄してから初期化していました。それが問題を引き起こしている可能性があります。必要なことは、ロードされたテクスチャ/テクスチャ アトラスをメモリに保持することです (それらの参照を失わないでください)。そうすれば、画面に戻ってもすべてのテクスチャがリロードされません。
rawTexture
の使用を避け、代わりにPOT (Power Of Two) TextureAtlas
を使用します。
この 2 つの手順を自分のプロジェクトに適用します。問題が解決したら、解決策を確認するために戻ってきます。
それはまったく問題ではありませんでした。テクスチャの破棄とロードの非常に長いループを実行しましたが、例外/エラーはスローされませんでした。私の上記の提案は解決策ではありません。問題はおそらく過度のScreen
切り替えに関連していますが、この問題は画面の向きを縦モードから横モードに、またはその逆に繰り返し変更するときにも発生するため、そうではないと思います.
解決:
私は's の呼び出しは自動的に 's だと思っていました (そうではありません) Game
。基になるテクスチャをすべて破棄するために使用されました。のオーバーライドされたメソッドを呼び出すことで、問題を解決しました。setScreen(screen)
Screen
dispose()
dispose()
dispose()
Screen
hide()
sを使用TextureAtlas
することは非常に重要です。これは、各 にアタッチされているハンドルの量Texture
を減らすためです。(これが EGL_SUCCESS エラーの原因である可能性があります)
GT-S5830
とGT-S5830i
(Samsung Galaxy Ace および Samsung Galaxy Y)の両方でテスト済み。問題は発生しなくなりました。