2016-10-13 15 views
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); 

кажется, что звонки не принимаются внутренне 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?

ответ

0

Так что мой вопрос: будет ли проблема с производительностью позже на из-за этого?

Это зависит от того, сколько раз вы будете использовать эту текстуру.

Следует ли добавить текстуру в кэш текстуры вручную?

Опять же, это зависит от того, сколько вы его используете. Если он создается динамически, несколько или несколько раз кеширование улучшит производительность, так как вам не нужно воссоздавать его снова и снова.

Есть ли какие-либо другие проблемы, с которыми я могу столкнуться, добавив свой спрайт кадров таким образом?

Я так не считаю.

Кроме того, моя текстура создается с помощью Texture2D * текс = новый Texture2D(), а затем initWithData(). Так должен ли я держать ссылку на этот указатель, и позвонить удалить позже?

Хорошо, если вы просто хотите отказаться от tex (что делает его локальной переменной), потому что вы создали спрайт из него, вы можете это сделать. Но sprite просто имеет указатель на эту текстуру. Если вы отпустите текстуру, она исчезнет (вероятно, станет черным прямоугольником).

Или достаточно просто вызвать removeUnusedTextures?

Это просто очищает карту TextureCache. Если текстуры здесь нет, она не будет выпущена.

Вам нужно будет указать прецедент этой текстуры. Если - предположим, у вас есть текстура, содержащая пулю (которую вы создали с помощью initWithData), которая часто используется. У вас может быть только один объект текстуры, сохраненный в вашей сцене, и вы должны создать все пулевые спрайты из этой одной текстуры. Использование TextureCache не будет быстрее. Однако вы должны помнить о выпуске текстурной памяти, когда вам это больше не нужно (например, когда вы покидаете сцену), потому что вы создаете Texture2D с использованием нового ключевого слова, а не создаете принцип (например, Sprite :: create, Texture2D не имеет его), который автоматически управляет памятью.

+0

Спасибо за ваш ответ, но моя проблема другая: текстура для моего листа спрайтов - это то, что создано динамически - так что все кадры в текстуре используются много раз во время сцены. Я создаю текстуру только один раз при запуске сцены и больше не нуждаюсь в текстуре в других сценах (так что ее нужно будет выгрузить). Я создаю кадры спрайтов так, как описано выше, и добавляю их в spriteframecache, но не добавляю ничего в кэш текстуры (должен ли я?). Какова же цель кеша текстуры? Может быть, мне это нужно? Потому что достаточно просто спрайтрампах? –

+0

Насколько я понимаю (и быстрый поиск в коде доказывает, что) SpriteFrameCache - это что-то вроде уровня TextureCache. TextureCache - это просто словарь пар filename, texture. С другой стороны, SpriteFrameCache полезен для обработки спрайтов. Это словарь spriteFrame и его имя. Он хранит словарные данные каждого кадра из спрайта. Однако текстуры все еще хранятся в TextureCache. – Makalele

+0

Я все еще не понимаю, что я должен делать - глядя на исходный код SpriteFrameCache, он не добавляет текстуру в кэш текстуры, если вы вызываете createWithTexture(). –