3

各シーンの開始時に次の「パージ」メソッドを呼び出すのは良い方法ですか? そうでない場合は、いつそれらを呼び出す必要がありますか?各呼び出しをいつ使用するかを説明するチュートリアルはありますか? 何か不足していますか?

    [CCTextureCache purgeSharedTextureCache];
    [CCSpriteFrameCache purgeSharedSpriteFrameCache];
    [CCAnimationCache purgeSharedAnimationCache];
    [CCShaderCache purgeSharedShaderCache];
    [[CCFileUtils sharedFileUtils] purgeCachedEntries];

(私は Cocos2d 2.0 を使用しており、ARC が有効になっています。関連性はないと思いますが、言及する価値はあると思います)

4

1 に答える 1

5

IMO cocos2d のキャッシュを完全に消去するのは悪い習慣です! キャッシュの消去は、電子機器を修理する際のハンマーと同じくらい便利なツールです。

すべてをパージして、パージしたアニメーションとテクスチャを次のフレームでリロードさせるだけでは逆効果です。キャッシュを無条件に消去すると、資産のメモリ管理の仕事が (うまく) 完了していません。

すべてを消去する用途はまだありますが、(UIKit アプリで cocos2d を完全にシャットダウンするなど) ほとんど使用しないでください。キャッシュされたリソースをすべて削除する必要があるからです。追加したものを削除し、それで十分でない場合は、できる限りのことを行いました。

アプリ開発者は、アプリの総メモリ使用量と、使用されているアセットと使用されていないアセットを認識する必要があります。cocos2dで扱うリソースも含みます。現在使用されておらず、近い将来も必要ないことがわかっているアセットのみをリリースします。それは本当に簡単ですが、単にキャッシュを消去するよりも多くの作業が必要です。これは機能しているように見えますが、実際にはひどいことです。

特にメモリ警告中にキャッシュをパージする際の問題の 1 つは、現在アセットをプリロードしているときにメモリ警告が発生する可能性があることです。アセットの読み込み中にキャッシュをパージすると、すでにプリロードされたアセットが削除され、必要になったらすぐに再度読み込む必要があるため、自分自身を撃っていることになります。最悪の場合、最初にアセットをロードするために必要な追加のメモリが原因でリロードが即座に発生した場合、実際には回復不能なメモリ警告が発生する可能性があります (つまり、テクスチャは短時間のロード中に 2 倍のメモリを使用します!)。

ほとんどの場合、キャッシュをパージしてもメモリ警告関連の終了が遅れるだけで、その間にゲームにラグが追加されます。残りのケースでは、ゲームが途切れて回復するため、おそらくより長い期間にわたって、単に悪い経験になります.

Cocos2D はメモリの警告中にキャッシュをパージするのは、最後の手段としてのみであり、主にメモリ使用量などのナンセンスを気にしない開発者向けです。これは、おそらく開発者の最初のアプリであっても、アプリ開発の最初のいくつかのステップを踏むために機能するソリューションですが、本格的/野心的な取り組みにはほとんど役に立ちません.

品質を重視する野心的なアプリ開発者は、メモリ警告に対してより適切に対応する必要があります。つまり、何よりもまず、メモリ警告を完全に最小限に抑えるように努力し (ここにいくつかのヒントがあります)、警告が発生した場合は、次の 2 つのことを確認する必要があります。

  1. アプリはまもなく終了する可能性があります。アプリの状態を必ず保存してください。
  2. この時点で絶対に必要ないと確信しているメモリを解放します。

#2について:エッジに近いプログラミングをしている場合は、アプリのメモリ使用量を完全に調整するある種の「メモリセーフ」モードにフォールバックすることをお勧めします。たとえば、表示するスプライトやパーティクルを減らし、 2 つのテクスチャの使用、追加の読み込み時間を犠牲にして特定のテクスチャを削除するなど。

ステップ 2 で十分なメモリを解放できない場合、cocos2d のキャッシュを消去するかどうかに関係なく、ほぼ必然的に 1 が発生します。CCTextureCache の「使用されていない」テクスチャをパージすることは役に立ちますが、スプライト フレームはテクスチャを保持するため、対応するスプライト フレームを最初に解放せずにテクスチャ アトラスを使用している場合、通常はあまり効果がありません (または何もしません)。心に留めておきます。

したがって、メモリ警告を処理するプロセスは次のとおりです。

  1. 使用中のアセットと、読み込み時間を短縮するためにキャッシュされているだけのアセットを把握します。
  2. 「現在必要のない」スプライト フレームを削除してから、CCTextureCache の removeUnusedTextures を呼び出します。これにより、アプリが使用しているメモリのほとんどを解放する可能性が高くなりますが、実際には必要なくなります。
  3. コードで割り当てた可能性があるが、現在使用されていないその他の不要なメモリを削除するか、「メモリセーフ」モードにフォールバックします (どのように実装しても)。
  4. 最善の結果を期待します。

cocos2d のキャッシュを無条件にパージしないでください! それは役に立たず、おそらく事態を悪化させるだけです。

すべての cocos2d キャッシュを考慮すると、メモリの 99% が CCTextureCache によって保持されます。したがって、とにかく他のキャッシュをパージしてもほとんど意味がありません。無視してください。

実際に現在使用しているテクスチャ アトラスを確認する必要があるだけで、使用していないものはスプライト フレームとそのテクスチャを削除します。

最初に .pvr.ccz テクスチャを使用している場合は、「読み込み時間を短縮するためのキャッシュ」を完全に無視して、使用を中止するたびにすべてのテクスチャ アトラスをメモリから削除することもできます。シーンの切り替えに関する限り、違いはありません。これは、そもそもメモリ警告を回避するのにも役立ちます。

于 2013-03-29T17:33:22.600 に答える