Рецепты по оптимизации текстур для OpenGL ES / Cocos2d - PullRequest
3 голосов
/ 25 января 2012

Мне дано около 30 текстур в формате PNG 32 бита.Все текстуры имеют одинаковый размер (шире экрана iPad).Размер не квадратный, а ширина и высота не являются степенью 2. Те же текстуры предназначены для использования в iPhone-версии игры.

В игре предполагается, что эти текстуры используются для анимации (каждая текстура является кадром анимации).Конечно, 30 текстур, каждый из которых использует 4 МБ, не очень быстро анимируются, и потребление памяти далеко не на приемлемом уровне.

Итак, будучи новичком в OpenGL ES и Cocos2d, я ищу рецептыЯ могу оптимизировать эти конкретные текстуры и текстуры в целом .

Дополнительная информация о текстурах, с которыми я должен иметь дело: все текстуры имеют одинаковый градиентный фон (поверхность моря) и разные области (волны).Каждая волна несколько уникальна, и волны занимают почти всю текстуру.Текстуры экспортируются из Flash (изначально это векторные изображения).

Ответы [ 2 ]

6 голосов
/ 25 января 2012

1) Используйте текстуры PVR вместо PNG.PVR предлагают ряд форматов и качеств, каждый из которых загружается быстрее, чем PNG, а сжатые варианты также занимают меньше памяти.

2) Объедините кадры анимации в один лист спрайтов, если это возможно, чтогораздо эффективнее.Cocos имеет встроенную поддержку листов спрайтов (он называет их атласы текстур).Это не будет работать для полноэкранных фреймов, потому что максимальный размер атласа составляет около 1024x1024.

3) Чтобы упростить свою жизнь, используйте инструмент создания листов спрайтов, который может автоматически создавать свои листы спрайтов и конвертироватьваши текстуры в PVR. TexturePacker и Zwoptex являются хорошими вариантами.

Совет LearnCocos2D по реорганизации анимации на отдельные части - хорошая идея, если вы можете.

ЕслиВы не можете сделать это из-за временных или технических причин. Я написал видео-проигрыватель OpenGL PVR на основе кадров, который может очень эффективно воспроизводить последовательность полноэкранных изображений, передавая их в память по одному кадру за раз.Он не использует Cocos2D и является просто автономным UIView, поэтому вы можете отобразить его в своем собственном контроллере представления, когда ваше приложение загружается до загрузки представления Cocos Director.

Вы можете получить его здесь: https://github.com/nicklockwood/GLView - включает документацию и примеры.Главное, что нужно иметь в виду, это то, что перед преобразованием в PVR вам необходимо изменить размеры ваших кадров изображения до степени квадрата степени двойки.Но не волнуйтесь, вы всегда можете растянуть их до первоначальных пропорций, когда вы играете их, чтобы это не было заметно.

6 голосов
/ 25 января 2012

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

Вам придется часто загружать и выгружать текстуры во время анимации, чтобы контролировать потребление памяти.Это ограничит достижимую частоту кадров анимации.Я подозреваю, что это будет в лучшем случае 30-40 кадров в секунду на устройствах iPad и 4-го поколения, вероятно, ужасно медленное на устройствах 1–3-го поколения.

Лучшая оптимизация, которую вы можете сделать, - это не использовать экспортируемые во Flash полноэкранные текстуры.В основном то, что делает Flash, это анимирует все для вас, а затем выводит полноэкранное изображение для каждого кадра анимации. Это худшее из возможных решений для анимации чего-либо для мобильных устройств.

Вместо этого, воссоздайте все анимации в cocos2d, используя отдельные изображения и действия cocos2d, чтобы создать ту же анимацию или ту, которая достаточно близка.,Это больше кода, но он будет работать намного лучше.Могут быть такие инструменты, как LevelHelper, которые могут вам помочь, но я не уверен, что они могут показать вам предварительный просмотр анимации в реальном времени.Есть также инструмент , который может импортировать анимацию временной шкалы Flash , но я не могу сказать, насколько хорошо он работает или работает ли он вообще.

Использование Texture Packer длясоздавать текстурные атласы из отдельных изображений для экономии памяти и ускорения рендеринга, особенно в сочетании с CCSpriteBatchNode.Plus Texture Packer позволяет экспериментировать с различными форматами текстур и экспортировать изображения с разрешением SD, если вы хотите поддерживать устройства, не поддерживающие Retina.

Потому что еще одна хорошая оптимизация заключается в том, чтобы уменьшить глубину цвета в битахвозможный.Если вы переходите от 32-битного к 16-битному режиму (RGBA4444 или RGBA5551 или RGB565 в зависимости от того, какой тип прозрачности вам нужен), вы уже вдвое сократили потребление памяти, а скорость рендеринга также немного увеличилась.

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

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

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

Подводя итог:

  • не используйтеполноэкранные текстуры, экспортируемые Flash (очень плохая идея), по крайней мере, попробуйте импортер анимации временной шкалы Flash для cocos2d
  • , используйте отдельные изображения, анимированные с помощью функций cocos2d
  • , используйте атласы текстур (и пакетирование спрайтов)чтобы уменьшить потребление памяти, увеличьте скорость
  • максимально уменьшите глубину цвета в битах, опять же, уменьшите память, увеличьте скорость
  • экспериментируйте с форматом сжатия PVR с потерями для быстрых / постоянно движущихся изображений
  • используйте меньшие изображения и увеличивайте их
...