0

通常、スプライト フレーム キャッシュをファイルからロードするときは、次のように呼び出します。

SpriteFrameCache::getInstance()->addSpriteFramesWithFile(filename);

内部的に、そのファイルに対応するテクスチャは、以下を呼び出してテクスチャ キャッシュに追加されます。

    Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(texturePath.c_str());

これは基本的に、その画像から Texture2D オブジェクトを作成し、それを unordered_map に格納します。


オンザフライでテクスチャを生成し、ループ内で以下のコードを呼び出してフレーム キャッシュにスプライト フレームを追加すると、これは内部的に発生しません。

その場でテクスチャを生成し、次のようにして SpriteFrameCache にスプライト フレームを追加します。

   SpriteFrame* frame;

    if (!isRotated) {
        frame = SpriteFrame::createWithTexture(texture, rect, isRotated, offset, originalSize);
    }else{
        frame = SpriteFrame::createWithTexture(texture, rect, isRotated, offset, originalSize);
    }
    SpriteFrameCache::getInstance()->addSpriteFrame(frame, frameName);

すべてのスプライト フレームが同じテクスチャを使用しているにもかかわらず、(addSpriteFrame() を呼び出して) この方法でフレームを追加すると、テクスチャ キャッシュで addImage() が内部的に呼び出されないようです。

openGL 呼び出しの数を表示する左下のカウンターは、画面に追加するフレームの数に関係なく、2 つの呼び出ししかないことを示しています。

通話時

p Director::getInstance()->getTextureCache()->getCachedTextureInfo()

出力が得られます:

(std::__1::string) $0 = "\"/cc_fps_images\" rc=4 id=254 999 x 54 @ 16 bpp => 105 KB\nTextureCache dumpDebugInfo: 1 テクスチャ、105 KB (0.10 MB) の場合\n "

これは fps レートを示すテクスチャです....私のテクスチャの兆候はありませんが、同時にそのテクスチャを使用するフレームを追加しても問題はありません。

私の質問は次のとおりです。これにより、後でパフォーマンスの問題が発生しますか? テクスチャを手動でテクスチャ キャッシュに追加する必要がありますか? この方法でスプライト フレームを追加することで発生する可能性のある他の問題はありますか?

また、Texture2D* tex = new Texture2D() を使用してから、initWithData() を使用してテクスチャを作成します。では、このポインターへの参照を保持し、後で delete を呼び出す必要がありますか? それとも removeUnusedTextures を呼び出すだけで十分ですか?

4

1 に答える 1

0

私の質問は次のとおりです。これにより、後でパフォーマンスの問題が発生しますか?

このテクスチャを何回使用するかによって異なります。

テクスチャを手動でテクスチャ キャッシュに追加する必要がありますか?

繰り返しますが、それは使用する数によって異なります。動的に作成される回数が少ない場合は、何度も再作成する必要がないため、キャッシュによってパフォーマンスが向上します。

この方法でスプライト フレームを追加することで発生する可能性のある他の問題はありますか?

私はそうは思わない。

また、Texture2D* tex = new Texture2D() を使用してから、initWithData() を使用してテクスチャを作成します。では、このポインターへの参照を保持し、後で delete を呼び出す必要がありますか?

texそれからスプライトを作成したので、単に放棄したい(ローカル変数にする)場合は、それを行うことができます。しかし、スプライトは単にこのテクスチャへのポインタを持っています。テクスチャ自体を解放すると消えます (おそらく黒い長方形になります)。

それとも removeUnusedTextures を呼び出すだけで十分ですか?

これは TextureCache マップをクリアするだけです。テクスチャがここにない場合、リリースされません。

このテクスチャのユース ケースを指定する必要があります。想像してみましょう - 頻繁に使用される弾丸 (initWithData を使用して作成したもの) を含むテクスチャがあるとします。シーンに保存できるテクスチャ オブジェクトは 1 つだけで、この 1 つのテクスチャからすべての弾丸スプライトを作成する必要があります。TextureCache を使用しても、これ以上高速になることはありません。ただし、テクスチャ メモリが必要なくなったとき (シーンを離れるときなど) は忘れずにテクスチャ メモリを解放する必要があります。新しいキーワードを使用して Texture2D を作成するためです。 )、メモリを自動管理します。

于 2016-10-14T11:32:14.917 に答える