Нужно ли нам добавлять текстуру в кеш текстур, чтобы воспользоваться преимуществами автоматической пакетной обработки?

Обычно, когда кто-то загружает кеш кадра спрайта из файла, вызывая:

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?


person Rahul Iyer    schedule 13.10.2016    source источник


Ответы (1)


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

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

Должен ли я добавить текстуру в кеш текстур вручную?

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

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

Я так не думаю.

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

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

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

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

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

person Makalele    schedule 14.10.2016
comment
Спасибо за ваш ответ, но моя проблема в другом: текстура для моего листа спрайтов создается динамически, поэтому все кадры в текстуре используются много раз во время сцены. Я создаю текстуру только один раз при запуске сцены и больше не нуждаюсь в текстуре в других сценах (поэтому нужно будет ее выгрузить). Я создаю кадры спрайтов, как описано выше, и добавляю их в кеш спрайтов, но ничего не добавляю в кеш текстур (должен ли я?). Какова цель кэша текстур? Нужен ли он мне тогда? Потому что не будет ли достаточно только кэша спрайтов? - person Rahul Iyer; 16.10.2016
comment
Насколько я понимаю (и быстрый поиск в коде это доказывает) SpriteFrameCache — это нечто на уровень выше TextureCache. TextureCache — это просто словарь пар имя файла, текстура. С другой стороны, SpriteFrameCache полезен для обработки листов спрайтов. Это словарь spriteFrame и его названия. Он хранит словарные данные каждого кадра из таблицы спрайтов. Однако текстуры по-прежнему хранятся в TextureCache. - person Makalele; 17.10.2016
comment
Я до сих пор не понимаю, что я должен делать - глядя на исходный код SpriteFrameCache, он не добавляет текстуру в кэш текстур, если вы вызываете createWithTexture(). - person Rahul Iyer; 17.10.2016
comment
На мой взгляд, вам вообще не нужен SpriteFrameCache. Вы не используете здесь spritesheet, потому что вы создаете текстуры на лету. У вас может быть одна большая текстура для листа спрайтов и несколько фреймов спрайтов, которые используют одну и ту же текстуру, но также сохраняют x, y, ширину и высоту, что делает их частью. - person Makalele; 17.10.2016
comment
Как же тогда использовать автопакетирование? Достаточно ли того, что все кадры спрайтов созданы из одной и той же текстуры? - person Rahul Iyer; 18.10.2016
comment
Это не может быть более эффективным с точки зрения памяти. Что касается рендеринга, вы, вероятно, можете его как-то оптимизировать. Что касается автопакетирования, вы должны спросить на форумах cocos2d-x. - person Makalele; 18.10.2016