iOS: воспроизведение покадровой анимации в оттенках серого в произвольном цвете - PullRequest
1 голос
/ 13 июня 2011

У меня есть 32-кадровая анимация в оттенках серого, в которой алмаз взрывается на куски (т.е. 32 PNG-изображения при 1024x1024)

моя игра состоит из 12 отдельных цветов, поэтому мне нужно выполнить анимацию в любом желаемом цвете

это, я считаю, исключает любые фреймворки Apple, а также исключает много открытого кода для анимации покадрового анимации в iOS.

каковы мои потенциальные пути решения?

это лучшие SO ссылки, которые я нашел:

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

Я вижу эти опции (перечислены самые ленивые в первую очередь, самые оптимизированные в последнюю очередь)

вариант A каждый кадр (предоставленоCADisplayLink), загрузите соответствующее изображение из файла в текстуру и отобразите эту текстуру

Я почти уверен, что это глупо, поэтому для опции B

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

Я думаю, что это будет идеальное решение, кто-нибудь может дать ему большой палец вверх или большой палец вниз?

опция C предварительно загружать все мои PNG в одну текстуру GL максимального размера, создавая атлас текстуры.в каждом кадре задайте координаты текстуры для прямоугольника в Atlas для этого кадра.

, хотя это потенциально идеальный баланс между эффективностью кодирования и производительностью, основной проблемой здесь является потеря разрешения;на старых устройствах iOS максимальный размер текстуры составляет 1024x1024.если мы поместим в него 32 кадра (на самом деле это то же самое, что и 64), мы получим 128x128 для каждого кадра.если полученная анимация близка к полноэкранному на iPad, она не взломает ее

опция D вместо загрузки в одну текстуру GL, а затем загрузите в кучу текстурмы можем сжать 4 изображения в одну текстуру, используя все четыре канала

Я не понимаю, сколько здесь нужно сложного кодирования.Мой RSI начинает дрожать, даже думая об этом подходе

Я думаю, что я ответил на свой вопрос здесь, но если кто-то на самом деле сделал это или может понять, пожалуйста, ответьте!

Ответы [ 2 ]

0 голосов
/ 21 июня 2013

Вы могли бы добиться того, чтобы это прекрасно работало с API-интерфейсами CoreGraphics, нет причин углубляться в OpenGL для такой простой 2D-задачи, как эта.Общий подход к созданию цветных рамок из рамки в оттенках серого см. В разделе colorizing-image-ignore-alpha-channel-why-and-how-to-fix .По сути, вам нужно использовать CGContextClipToMask (), а затем визуализировать определенный цвет, чтобы остался алмаз, окрашенный в определенный цвет, который вы выбрали.Вы можете сделать это во время выполнения, или вы можете сделать это в автономном режиме и создать 1 видео для каждого из цветов, которые вы хотите поддерживать.На вашем процессоре будет проще, если вы выполните операцию N раз и сохраните результаты в файлах, но современное оборудование iOS работает намного быстрее, чем раньше.Остерегайтесь проблем использования памяти при написании кода видеообработки, см. video-and-memory-use-on-ios-devices для учебника, описывающего проблемное пространство.Вы могли бы закодировать все это с помощью текстурных атласов и сложных вещей openGL, но с подходом, использующим видео, было бы намного легче справиться, и вам не нужно было бы так сильно беспокоиться об использовании ресурсов, смотрите мою библиотеку, связанную в памятиопубликовать для получения дополнительной информации, если вы заинтересованы в экономии времени на реализацию.

0 голосов
/ 14 июня 2011

Если требуется что-то более высокое, чем (B), похоже, что ключ - glTexSubImage2D http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage2D.xml

Вместо того, чтобы перетаскивать по одному кадру за раз из памяти, мы можем упорядочить, скажем, 16 512x512x8-битных кадров в градациях серого в памяти, отправить их через GL в виде одной 1024x1024x32-битной RGBA-текстуры, а затем разделить ее внутри GL с помощью приведенного выше функция.

Это будет означать, что мы выполняем одну передачу [RAM-> VRAM] на 16 кадров, а не на один кадр.

Конечно, для более современных устройств мы могли бы получить 64 вместо 16, поскольку более современные устройства iOS могут обрабатывать текстуры 2048x2048.

Сначала я попробую технику (B) и оставлю ее на этом, если она работает (я не хочу перезаписывать код), и при необходимости посмотрю на это.

Я до сих пор не могу найти способ узнать, сколько текстур GL можно сохранить на графическом чипе. Мне сказали, что когда вы пытаетесь выделить память для текстуры, GL просто возвращает 0, когда ей не хватает памяти. однако, чтобы реализовать это должным образом, я хотел бы убедиться, что я не плыву близко к ветру: ресурсы ... Я не хочу, чтобы моя анимация использовала столько VRAM, что остальная часть моего рендеринга не удалась ...

...