OpenGL ES を使用して 2D の iPhone ゲームを作成していますが、24 MB のメモリ制限に達し続けています。アプリケーションがエラー コード 101 でクラッシュし続けています。私が期待するよりも大きい。
Memory Monitor、Object Alloc、Leaks、および OpenGL ES インストゥルメントを使用してアプリケーションを実行しました。アプリケーションが読み込まれると、空き物理メモリが 37 MB から 23 MB に減少し、オブジェクトの割り当ては約 7 MB で落ち着き、リークはサイズが数バイトの 2 つまたは 3 つのリークを示し、Gart オブジェクト サイズは約 5 MB であり、メモリ モニターは、アプリケーションは、約 14 MB の実メモリーを占有します。メモリがどこに行ったのか当惑しています。オブジェクトの割り当てを掘り下げると、ほとんどのメモリは予想どおりテクスチャにあります。しかし、私自身のテクスチャ割り当てカウンターと Gart Object Size の両方が、テクスチャが約 5 MB を占めるはずであることに同意しています。
言及する価値のあるものを他に割り当てていることは認識しておらず、Object Alloc も同意しています。記憶はどこへ行く?(これで十分でない場合は、詳細を提供していただければ幸いです。)
更新:私は本当に多くのメモリを割り当てることができる場所を見つけようとしましたが、結果はありませんでした. 私を夢中にさせるのは、オブジェクトの割り当て (~7 MB) とメモリ モニター (~14 MB) で示される実際のメモリ使用量の違いです。私が忘れている巨大なリークや巨大なメモリのチャンクがあったとしても、それは Object Allocationsに表示されるはずですよね?
私はすでに通常の 容疑者を試しました。キャッシングを使用しましたUIImage
が、それは役に立ちませんでした。各ステートメントがメモリ使用量に与える影響を監視しながら、メモリ使用量を「デバッガー スタイル」で 1 行ずつ追跡する方法はありますか?
私がこれまでに見つけたもの:
私は本当に多くのメモリを使用しています。実際のメモリ消費量を測定するのは簡単ではありませんが、たくさん数えてみると、メモリ消費量は本当に多いと思います。私のせいです。
使用されたメモリを測定する簡単な方法が見つかりませんでした。メモリ モニタの数値は正確ですが (これらは実際に重要な数値です)、メモリ モニタはメモリがどこにあるのか正確にはわかりません。Object Alloc ツールは、実際のメモリ使用量の追跡にはほとんど役に立ちません。テクスチャを作成すると、割り当てられたメモリ カウンタがしばらく上昇し (テクスチャをメモリに読み込む)、その後低下します (テクスチャ データを OpenGL に渡し、解放します)。これは問題ありませんが、常に発生するとは限りません。テクスチャが OpenGL に渡され、「自分の」メモリから解放された後でも、メモリ使用量が高いままになることがあります。これは、Object Alloc ツールで表示されるように割り当てられたメモリの合計量が、実際の合計メモリ消費量よりも少なく、実際の消費量からテクスチャを差し引いたものよりも大きいことを意味します (
real – textures < object alloc < real
)。図に行きます。プログラミング ガイドを読み間違えました。24 MB のメモリ制限は、アプリケーション全体ではなく、テクスチャとサーフェスに適用されます。実際の赤い線はもう少し先にありますが、明確な数字は見つかりませんでした。コンセンサスは、25 ~ 30 MB が上限であるということです。
システムがメモリ不足になると、メモリ警告の送信を開始します。解放するものはほとんどありませんが、他のアプリケーション、特に Safari (Web サイトをキャッシュしているようです) がメモリを解放してシステムに戻します。メモリ モニタに表示される空きメモリがゼロになると、システムは強制終了を開始します。
弾丸をかじり、コードの一部を書き直して、メモリをより効率的に使用する必要がありましたが、おそらくまだそれを推し進めています。私が別のゲームをデザインするとしたら、リソースのページングを思いつくでしょう。現在のゲームでは、別のスレッドで実行されたとしても、物が常に動いていて、テクスチャのロードが邪魔になるため、非常に困難です。他の人がこの問題をどのように解決するかに非常に興味があります。
これらは私の見解であり、それほど正確である必要はないことに注意してください。このトピックについて何か言いたいことがあれば、質問を更新します。問題を理解している誰かが答えたいと思う場合に備えて、質問を開いたままにします。これらはすべて、他の何よりも回避策と推測であるためです。