通常、スプライト フレーム キャッシュをファイルからロードするときは、次のように呼び出します。
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 を呼び出すだけで十分ですか?