Обычно, когда один загружает кэш спрайт кадр из файла с помощью вызова:Нужно ли добавлять текстуру в кеш текстуры, чтобы получить преимущества автозахвата?
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 вызова, независимо от того, сколько кадров я добавляю на экран.
При вызове
р директор :: 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(). Так должен ли я держать ссылку на этот указатель и позже вызывать удаление? Или достаточно просто вызвать removeUnusedTextures?
Спасибо за ваш ответ, но моя проблема другая: текстура для моего листа спрайтов - это то, что создано динамически - так что все кадры в текстуре используются много раз во время сцены. Я создаю текстуру только один раз при запуске сцены и больше не нуждаюсь в текстуре в других сценах (так что ее нужно будет выгрузить). Я создаю кадры спрайтов так, как описано выше, и добавляю их в spriteframecache, но не добавляю ничего в кэш текстуры (должен ли я?). Какова же цель кеша текстуры? Может быть, мне это нужно? Потому что достаточно просто спрайтрампах? –
Насколько я понимаю (и быстрый поиск в коде доказывает, что) SpriteFrameCache - это что-то вроде уровня TextureCache. TextureCache - это просто словарь пар filename, texture. С другой стороны, SpriteFrameCache полезен для обработки спрайтов. Это словарь spriteFrame и его имя. Он хранит словарные данные каждого кадра из спрайта. Однако текстуры все еще хранятся в TextureCache. – Makalele
Я все еще не понимаю, что я должен делать - глядя на исходный код SpriteFrameCache, он не добавляет текстуру в кэш текстуры, если вы вызываете createWithTexture(). –