0

ゲーム アプリで何らかのメモリの問題が発生しています。初めて実行すると、スプラッシュ スクリーン アクティビティが機能し、レベル選択アクティビティが機能し、次にゲーム プレイ モードが機能し、多くのレベルを問題なくプレイできます。それから私はゲームをやめました。次に、アプリを 2 回目に実行すると、スプラッシュ画面が表示される前に、OutOfMemoryError: ビットマップ サイズが VM の予算を超えています。

私のアプリは、次のような SD_globals という単一のアプリケーションに基づいています。

public class SD_Globals extends Application
{
    int example_global_data = 99;
    // stuff
}

それぞれが SD_Globals で宣言されたさまざまなグローバル データにアクセスできます。たとえば、アクティビティの 1 つは次のような SD_gameplay です。

public class SD_GamePlay extends Activity implements View.OnClickListener
{
    SD_Globals gs; // gs stands for global state

    gs = ((SD_Globals)getApplicationContext());

    // now I can access global variable using code like this:
    int x = gs.example_global_data;
}

このセットアップでどのような種類のエラーが発生する可能性があるかについてのアイデアは大歓迎ですが、それは私の特定の質問ではありません.

DDMS とメモリ アナライザーを使用して問題を診断する方法について少し読んだことがありますが、最も有用な情報を得るために [Dump HPROF file] ボタンを押すのに最適な時期はいつなのか、よくわかりません。ゲームがまだプレイ中なのか、ゲームを終了した後 (ただし 2 回目の実行前) なのか、それともクラッシュした直後なのか?

編集: Akhil の回答に応じて、getApplicationContext() を各個別のアクティビティの onCreate メソッドで 1 回だけ使用し、他のインスタンスでは使用しないことを明確にします。また、この一般的なアプリケーション構造 ( を使用gs = ((SD_Globals)getApplicationContext())) は、数週間前から市場に出回っていて、30,000 回のダウンロードがあり、Google Play に報告された OutOfMemoryError がゼロである私のゲームの古いバージョンで完全に堅牢に機能していると言う必要があります。

4

1 に答える 1

1

必要であることが確実でない限り、getApplicationContext() を使用しないでくださいそれはあなたの資産の適用範囲を決めており、それらはリサイクルされていません。アクティビティのように、提供できる最も狭いコンテキストに固執します。そのすべての出現を変更します。

これはゲームなので、ビットマップを使用していると想定しています。それらが含まれているアクティビティが破棄されているときにそれらをリサイクルしていますか(アクティビティをアプリケーション全体ではなくコンテキストとして使用していることを確認してください)。

定期的に hprof からヒープをダンプする必要があります(アクティビティごとに 2 ~ 3 回程度)。これにより、時間の離れたヒープを比較することで、アプリで時間を費やしているときにメモリ リークの原因を確認できます。 .

これは、質問が理論的なものであるため、私が提供できる一般的な答えです。

于 2012-04-25T10:24:33.713 に答える