iOS: воспроизведение покадровой анимации в оттенках серого с пользовательским цветом

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

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

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

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

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

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

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

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

Я почти уверен, что это глупо, так что на вариант Б

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

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

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

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

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

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

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


person P i    schedule 13.06.2011    source источник


Ответы (2)


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

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

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

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

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

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

person P i    schedule 14.06.2011
comment
связанные: stackoverflow.com/questions/6683822/ - person P i; 14.07.2011

Вы могли бы заставить это работать нормально с API-интерфейсами CoreGraphics, нет причин глубоко погружаться в OpenGL для решения простой 2D-задачи, подобной этой. Общий подход к созданию цветных кадров из кадра в оттенках серого см. в разделе раскрашивание-изображения-игнорирует-альфа-канал-почему-и-как-исправить. По сути, вам нужно использовать CGContextClipToMask(), а затем визуализировать определенный цвет, чтобы остался ромб, окрашенный в определенный цвет, который вы выбрали. Вы можете сделать это во время выполнения или в автономном режиме и создать 1 видео для каждого цвета, который вы хотите поддерживать. Это будет проще для вашего процессора, если вы выполните операцию N раз и сохраните результаты в файлы, но современное оборудование iOS намного быстрее, чем раньше. Остерегайтесь проблем с использованием памяти при написании кода обработки видео, см. использование-видео-и-памяти-на-устройствах-ios для учебника, описывающего проблемную область. Вы можете кодировать все это с помощью атласов текстур и сложных вещей openGL, но подход, использующий видео, будет намного проще, и вам не нужно будет так сильно беспокоиться об использовании ресурсов, см. мою библиотеку, связанную в памяти. сообщение для получения дополнительной информации, если вы заинтересованы в экономии времени на реализации.

person MoDJ    schedule 20.06.2013