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(使其成为局部变量),因为您从中创建了精灵,您可以做到。但是 sprite 只是有一个指向这个纹理的指针。如果您要释放纹理本身,它会消失(可能会变成黑色矩形)。

还是只调用 removeUnusedTextures 就足够了?

这只是清除 TextureCache 贴图。如果您的纹理不在这里,它将不会释放它。

您必须指定此纹理的用例。如果 - 让我们想象一下 - 你有一个纹理,其中包含一个经常使用的子弹(你使用 initWithData 创建的)。您只能在场景中存储一个纹理对象,并且必须从这一纹理创建所有子弹精灵。使用 TextureCache 不会更快。但是你必须记住当你不再需要它时(例如当你离开场景时)释放纹理内存,因为你使用 new 关键字创建 Texture2D,而不是创建原则(如 Sprite::create,Texture2D 没有它),它自动管理内存。

于 2016-10-14T11:32:14.917 回答