通常,当通过调用从文件加载精灵帧缓存时:
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 就足够了?