Производительность и фоновые изображения для OpenGL ES / iPhone - PullRequest
7 голосов
/ 07 января 2009

Я разрабатываю 2D-игру для iPhone с использованием OpenGL ES, и я хотел бы использовать растровое изображение размером 320x480 в качестве постоянного фона.

Моей первой мыслью было создать четырехугольник размером 320х480, а затем нанести на него текстуру, представляющую фон. Итак ... Я создал текстуру 512x512 с изображением 320x480. Затем я сопоставил это с квадратом 320x480.

Я рисую этот фон каждый кадр, а затем рисую анимированные спрайты поверх него. Это работает отлично, за исключением того, что рисование всех этих объектов (фон + спрайты) происходит слишком медленно.

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

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

Вот еще немного информации:

1) Я сейчас тестирую на симуляторе (все еще жду в Apple лицензии)

2) Фон представляет собой текстуру PVR, сжатую до 128k

3) Я надеялся, что мог бы быть способ кешировать этот фон в цветовой буфер, но мне не повезло с этим. это может быть связано с моей неопытностью в OpenGL ES или просто глупой идеей, которая не сработает:)

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

Любые советы / рекомендации будут с благодарностью ...

Спасибо.

Ответы [ 6 ]

8 голосов
/ 13 января 2009
  1. Не проводить тестирование производительности на симуляторе. Ever!
    Отличия от реального оборудования огромны. В обе стороны
  2. Если вы рисуете фон в каждом кадре:
    Не очищайте кадровый буфер. В любом случае фон все это переопределит.
  3. Вам действительно нужна фоновая текстура?
    Как насчет использования цветового градиента через цвета вершин?
  4. Попробуйте использовать 2-битный режим для текстуры.
  5. Поворот всех шагов рендеринга, которые вам не нужны для фона.
    Например: освещение, смешивание, тест глубины, ...

Если бы вы могли опубликовать часть своего кода для рисования, вам было бы намного легче помочь.

5 голосов
/ 13 января 2009

Если вы делаете 2D-игру, есть ли причина, по которой вы не используете существующую библиотеку? В частности, cocos2d для iPhone может стоить вашего времени. Я не могу ответить на ваш вопрос о том, как решить проблему, выполнив все это самостоятельно, но я могу сказать, что я сделал именно то, о чем вы говорите (имея один полноэкранный фон со спрайтами сверху) с помощью cocos2d, и это работает отличный. (Предполагая, что 60 кадров в секунду достаточно быстры для вас.) У вас могут быть причины сделать это самостоятельно, но если вы можете, я настоятельно рекомендовал бы по крайней мере сделать быстрый прототип с cocos2d и посмотреть, не поможет ли это вам. (Подробности и источник для версии iPhone здесь: http://code.google.com/p/cocos2d-iphone/)

3 голосов
/ 20 марта 2009

Спасибо всем, кто предоставил информацию об этом. Все советы выручали тем или иным способом.

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

1 голос
/ 13 января 2009

У меня нет большого опыта работы с OpenGL ES, но эта проблема обычно возникает.

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

В OpenGL это довольно просто с объектами кадрового буфера (FBO). К сожалению, я не думаю, что OpenGL ES поддерживает их, но это может дать вам возможность начать поиск.

0 голосов
/ 06 марта 2009
  1. Вы можете использовать объекты кадрового буфера, подобные примеру GLPaint от Apple.
  2. Используйте текстурный атлас, чтобы минимизировать количество вызовов, которые вы делаете. Вы можете использовать glTexCoordPointer для установки координат текстуры, которые отображают каждое изображение в правильное положение. Не забудьте установить свой буфер вершин тоже. В идеале один вызов отрисовки отрисовывает всю вашу 2D сцену.
  3. Избегайте включения / выключения состояний, где это возможно.
0 голосов
/ 13 января 2009

Вы можете попробовать использовать VBO (объекты буфера вершин) и посмотреть, ускоряет ли это процесс. Урок здесь

Кроме того, я только что увидел, что начиная с OpenGL ES v1.1 , существует функция glDrawTex (Draw Texture), предназначенная для

быстрая отрисовка фоновых рисунков, глифов растровых шрифтов и элементов 2D-кадрирования в играх

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...