Какие изображения следует помещать в таблицу спрайтов для приложения cocos2d ios?

Я заранее прошу прощения за длинный вопрос с множеством подвопросов, но вопрос действительно такой, как указано в заголовке. Все, что следует ниже, представляет собой подробное разложение различных аспектов вопроса.

В моей универсальной игре для ios, созданной с использованием cocos2d, у меня есть четыре категории изображений - я хочу определить, какие из них следует помещать в таблицы спрайтов, а какие лучше загружать как отдельные изображения. Мое текущее предположение состоит в том, что только анимация персонажей, которая выполняется на протяжении всей игры, дает значение, загружаемое в память в виде таблиц спрайтов:

  1. Анимация персонажей, которая выполняется на протяжении всего игрового процесса (кроме случаев, когда пользователь находится в меню): для них я предполагаю, что наличие изображений в таблице спрайтов уменьшит использование памяти во время выполнения (из-за заполнения отдельных файлов до двух байтовых границ), следовательно, они являются кандидатами для таблицы спрайтов. Это правильно?
  2. Маленькие изображения (около 200 из них), из которых от 0 до 4 отображаются в любое время, выбираются случайным образом во время игры. Для них я не уверен, стоит ли загружать в память все 200 изображений, когда одновременно используются не более четырех. Так что может быть лучше напрямую обращаться к ним как к изображениям. Это правильно?
  3. Несколько (около 20) небольших элементов меню, таких как кнопки, которые используются только в статических меню: поскольку элементы меню используются только во время отображения меню, я предполагаю, что они не имеют большого значения для улучшения доступа к памяти через таблицы спрайтов. Это правильно?
  4. Несколько больших изображений, которые используются в качестве фона для меню, игровой сцены и т. Д. Большинство этих изображений имеют размер, равный разрешению экрана. Поскольку разрешение экрана примерно равно максимальному размеру одного изображения (например, для ipad retina размер изображения 4096 x 4096 по сравнению с размером экрана 2048 x 1536), от использования таблиц спрайтов не так много пользы, как максимум 1 или 2 больших изображения поместятся в один спрайт-лист. Кроме того, поскольку каждый из этих больших файлов используется только в одной сцене, предварительная загрузка всех этих больших изображений в виде таблиц спрайтов в память кажется ненужными накладными расходами. Следовательно, доступ к ним напрямую как к таблицам спрайтов. Это правильно?

Пара общих связанных вопросов:

а) Упаковка изображений, используемых в разных сценах, в одну таблицу спрайтов заставляет нас загружать их в память, даже если в этой сцене используется только подмножество изображений. Я полагаю, это плохая идея. Правильный?

б) Подтормаживание игры происходит только на старых устройствах (iPad 1 и iPhone 3gs). Помогут ли таблицы спрайтов уменьшить такое заикание?

c) Я предполагаю, что таблицы спрайтов только улучшат объем памяти во время выполнения, а не столько размер архива приложения на диске. Я заметил, например, что набор файлов размером 11,8 МБ, помещенный в таблицу спрайтов, составляет 11 МБ - не так много преимуществ сжатия. Это верное предположение?

Пожалуйста, дайте мне знать, что вы думаете по поводу моего обоснования выше.

Спасибо

Ананд


person Anand    schedule 14.01.2013    source источник


Ответы (1)


Практическое правило: все помещается в таблицу спрайтов (атлас текстур), если нет веской причины не делать этого.

  1. Однозначно текстурный атлас.

  2. Механизм кэширования Cocos2d заставит все отдельные изображения кэшироваться и оставаться в памяти, поэтому в конечном итоге они будут использовать больше, чем если бы они были в атласе текстуры. Я бы использовал только отдельные изображения, если они редко нужны (например, значки меню), и я бы также удалил их из CCTextureCache сразу после того, как они были добавлены в сцену, чтобы убедиться, что они будут удалены из памяти при выходе из этого экрана меню. .

  3. Предположение может быть ошибочным. Изображение 320x480 использует 512x512 в качестве текстуры в памяти. Если у вас их несколько, возможно, лучше будет объединить их все в один текстурный атлас. Если вы не включили поддержку NPOT в cocos2d. Опять же, не забывайте, что CCTextureCache кэширует текстуры.

  4. Имейте в виду, что большие текстуры сильно выигрывают от пакетирования спрайтов. Таким образом, даже если в атласе текстур может быть только 2-3 изображения, это может повлиять на производительность.

а) Это действительно зависит от обстоятельств. Если вашему приложению не хватает памяти, вы можете иметь отдельные атласы текстур. В противном случае было бы расточительно не упаковывать изображения в один атлас текстуры (если это возможно).

б) Это зависит от того, что вызывает заикание. Наиболее частая проблема: загрузка ресурсов (например, изображений) во время игры или создание и удаление множества узлов в каждом кадре вместо повторного использования существующих.

в) Наверное. Это может зависеть от инструмента текстурного атласа (я рекомендую TexturePacker). Это определенно зависит от формата файла. Если вы можете упаковать несколько PNG в один атлас текстур .pvr.ccz, вы сэкономите много памяти (и увеличите скорость загрузки).

Для получения дополнительной информации см. Мою память cocos2d сообщение в блоге по оптимизации.

person LearnCocos2D    schedule 14.01.2013
comment
Спасибо, это было очень полезно. - person Anand; 16.01.2013