Обычно, когда кто-то загружает кеш кадра спрайта из файла, вызывая:
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);
Кажется, что внутренние вызовы addImage() в кэше текстур не выполняются, когда я добавляю кадры таким образом (вызывая addSpriteFrame()), хотя все кадры спрайтов используют одну и ту же текстуру.
Счетчик в левом нижнем углу, отображающий количество вызовов openGL, говорит, что вызовов всего 2, независимо от того, сколько кадров я добавляю на экран.
При звонке
p Director::getInstance()->getTextureCache()->getCachedTextureInfo()
Я получаю вывод:
(std::__1::string) $0 = "\"/cc_fps_images\" rc=4 id=254 999 x 54 @ 16 bpp => 105 КБ\nTextureCache dumpDebugInfo: 1 текстура, для 105 КБ (0,10 МБ)\n "
Какая текстура показывает скорость кадров в секунду.... так что нет никаких признаков моей текстуры, но в то же время нет проблем с добавлением кадров, использующих эту текстуру.
Итак, мой вопрос: не будет ли из-за этого проблем с производительностью позже? Должен ли я добавить текстуру в кеш текстур вручную? Существуют ли какие-либо другие проблемы, с которыми я могу столкнуться, добавляя кадры спрайтов таким образом?
Кроме того, моя текстура создается с помощью Texture2D* tex = new Texture2D(), а затем initWithData(). Так должен ли я сохранить ссылку на этот указатель и вызвать удаление позже? Или достаточно просто вызвать removeUnusedTextures?