Большой фон прокрутки в OpenGL ES - PullRequest
3 голосов
/ 20 октября 2008

Я работаю над 2D-прокруткой для iPhone. У меня большой фон изображения, скажем, 480 × 6000 пикселей, из которого видна только часть (ровно один экран, 480 × 320 пикселей). Как лучше всего получить такой фон на экране?

В настоящее время у меня есть фон, разбитый на несколько текстур (чтобы обойти ограничение максимального размера текстуры), и рисую весь фон в каждом кадре в виде текстурированной треугольной полосы. Прокрутка осуществляется путем перевода матрицы вида модели. Поле ножниц установлено в размере окна 480 × 320 пикселей. Это не должно быть быстрым, я просто хотел рабочий код, прежде чем приступить к оптимизации.

Я подумал, что, возможно, реализация OpenGL будет достаточно умной, чтобы отбросить невидимую часть фона, но, согласно написанному мною коду измерения, похоже, что для прорисовки фона в среднем требуется 7 мс, а максимум - 84 мс. (Это измеряется в симуляторе.) Это примерно половина всего цикла рендеринга, т.е. довольно медленно для меня.

Рисование фона должно быть таким же простым, как копирование 480 × 320 пикселей из одной части VRAM в другую или, другими словами, быстрое копирование. Как лучше всего приблизиться к такой производительности?

Ответы [ 2 ]

4 голосов
/ 20 октября 2008

Это быстрый способ сделать это. Что вы можете сделать, чтобы улучшить производительность:

  • Попробуйте разные форматы текстур. Предположительно, документы SDK содержат подробную информацию о предпочтительном формате, и, вероятно, чем меньше, тем лучше.
  • Вычеркните полностью неэкранные плитки самостоятельно
  • Разделить изображение на более мелкие текстуры

Я предполагаю, что вы рисуете с масштабированием 1: 1; это тот случай?

Редактировать: Упс. Внимательно прочитав ваш вопрос, я должен предложить еще один совет: Сроки, сделанные на симуляторе, ничего не стоят.

2 голосов
/ 20 октября 2008

Быстрое решение:

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

  • Нанесение текстур на все эти плитки.

  • Как только одна плитка выходит за пределы видимой области, вы можете освободить эту текстуру и связать новую.

  • Переместите плитки, используя по модулю ширину плитки и высоту плитки в качестве позиции (чтобы плитка переместилась в начальную позицию, когда она переместилась ровно на одну плитку в длину). Также не забудьте переназначить текстуры во время этой операции. Это позволяет вам загружать очень маленькую сетку / очень мало памяти текстур в любой момент времени. Что, я думаю, особенно важно в GL ES.

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

Вот ссылка на движок плиток GL (не ES). Я не использовал его сам, поэтому я не могу поручиться за его функциональность, но он может помочь вам: http://www.mesa3d.org/brianp/TR.html

...