Производительность и фоновые изображения для OpenGL ES / iPhone

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

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

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

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

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

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

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

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

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

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

Будем очень признательны за любые советы / советы ...

Спасибо.


person g-dog    schedule 07.01.2009    source источник
comment
Вы запускали это в симуляторе или на реальном?   -  person Cheery    schedule 13.01.2009


Ответы (6)


  1. Не проводите тестирование производительности на симуляторе. Всегда!
    Отличия от реального оборудования огромны. В обе стороны.
  2. Если вы рисуете фон в каждом кадре:
    Не очищайте буфер кадра. Фон все равно будет перерисовывать все это.
  3. Вам действительно нужна фоновая текстура?
    Как насчет использования цветового градиента через цвета вершин?
  4. Попробуйте использовать 2-битный режим для текстуры.
  5. Turn of all render steps that you do not need for the background.
    E.g.: Lighting, Blending, Depth-Test, ...

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

person Andreas    schedule 13.01.2009
comment
Я бегаю только на симуляторе, потому что это все, что у меня сейчас есть;) Все еще жду на apple. Кроме того, я не очищаю фреймбуфер, отключаю эффекты и пробовал 2-битную текстуру (выглядит плохо). как вы предлагаете, мне, возможно, придется использовать эффекты в качестве фона. Я вижу это во многих играх. благодаря. - person g-dog; 21.01.2009

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

person Adam Byram    schedule 13.01.2009
comment
Я предпочитаю создавать с нуля, чтобы иметь дополнительную степень контроля. Тем не менее, я обязательно проверю cocoas2d. Одна из проблем заключается в том, что помимо фона у меня есть более 10 больших спрайтов, которые появляются на экране одновременно. Вы делали что-нибудь подобное с cocoas2d? Спасибо - person g-dog; 21.01.2009

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

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

person g-dog    schedule 20.03.2009

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

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

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

person Akusete    schedule 13.01.2009
comment
Странно ... похоже, что расширение объекта framebuffer поддерживается в OpenGL ES 1.0, но я не могу получить подтверждения, что расширение доступно на iphone. Думаю, я просто протестирую это и опубликую свои выводы. благодаря. - person g-dog; 21.01.2009
comment
Упс, чтобы уточнить ... Расширение фреймбуфера поддерживается. Что мне нужно протестировать, так это создание второго фреймбуфера, к которому я затем прикреплю текстуру. - person g-dog; 21.01.2009

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

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

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

person Sebastian    schedule 13.01.2009
comment
Я уже использую vbos. Узкое место, с которым я столкнулся, - это пиксельный конвейер. Я смог доказать это, удалив все текстуры и отрисовав только каркасы. В этой конфигурации приложение работает очень быстро. Спасибо... - person g-dog; 21.01.2009

  1. Вы можете использовать объекты буфера кадра, аналогичные примеру GLPaint от Apple.
  2. Используйте атлас текстур, чтобы свести к минимуму количество выполняемых вызовов отрисовки. Вы можете использовать glTexCoordPointer для установки координат текстуры, которая сопоставляет каждое изображение с его правильным положением. Не забудьте также установить буфер вершин. В идеале один вызов отрисовки визуализирует всю вашу 2D-сцену.
  3. По возможности избегайте включения / выключения состояний.
person Dimitris    schedule 06.03.2009