Советы по ускорению OpenGL ES 1.1 на iPhone - PullRequest
9 голосов
/ 04 декабря 2009

Я работаю над приложением для iPhone, которое сильно зависит от OpenGL. Прямо сейчас он работает немного медленно на iPhone 3G, но выглядит быстро на новом 32G iPod Touch. Я предполагаю, что это связано с аппаратным обеспечением. В любом случае, я хочу, чтобы производительность iPhone напоминала производительность iPod Touch. Я полагаю, что я делаю много вещей неоптимально в OpenGL, и я хотел бы получить совет о том, какие улучшения дадут мне максимальную отдачу.

Рендеринг моей сцены выглядит примерно так:

  • Повторите 35 раз
    • glPushMatrix
    • glLoadIdentity
    • glTranslate
    • повторите 7 раз
      • glBindTexture
      • glVertexPointer
      • glNormalPointer
      • glTexCoordPointer
      • glDrawArrays (GL_TRIANGLES, ...)
    • glPopMatrix

Мои координаты вершин, нормалей и текстур уже чередуются.

Итак, какие шаги я должен предпринять, чтобы ускорить это? Какой шаг ты бы попробовал первым?

Моя первая мысль - устранить все эти вызовы glBindTexture () с помощью Атласа текстур.

А как насчет более эффективных матричных операций? Я понимаю, что версии gl * () не слишком эффективны.

А как насчет VBO?

Обновление

Есть 8260 треугольников. Размеры текстур - 64x64 png. Есть 58 различных текстур.

Я не запускал инструменты.

Обновление 2

После запуска инструмента OpenGL ES на iPhone 3G я обнаружил, что моя утилита Tiler находится в диапазоне 90-100%, а моя утилита рендеринга - в 30%.

Обновление 3

Texture Atlasing не оказала заметного влияния на проблему. Диапазоны использования остаются такими же, как указано выше.

Обновление 4

Преобразование моих вершинных и нормальных указателей в GL_SHORT, казалось, улучшило FPS, но использование Tiler все еще находится в диапазоне 90% в большинстве случаев Я все еще использую GL_FLOAT для моих текстурных координат. Я полагаю, что смогу свести их к GL_SHORT и сохранить еще четыре байта на вершину.

Обновление 5

Преобразование моих текстурных координат в GL_SHORT привело к еще одному увеличению производительности. Теперь я постоянно получаю> 30 FPS. Коэффициент использования плит по-прежнему составляет около 90%, но часто падает в диапазоне 70-80%. Использование Renderer колеблется около 50%. Я полагаю, это может быть связано с масштабированием координат текстуры из матричного режима GL_TEXTURE.

Я все еще ищу дополнительные улучшения. Я хотел бы приблизиться к 40 кадрам в секунду, поскольку это то, что получает мой iPod Touch, и оно там плавное и плавное. Если кто-то все еще обращает на себя внимание, то какие еще низкие фрукты я могу выбрать?

Ответы [ 6 ]

7 голосов
/ 12 декабря 2009

Поскольку использование тайлера все еще превышает 90%, вы, вероятно, по-прежнему ограничены пропускной способностью вершин. Ваше использование рендерера выше, потому что графический процессор рендерит больше кадров. Если основное внимание вы уделяете повышению производительности на старых устройствах, то ключом к тому же является сокращение количества данных вершин, необходимых для каждого треугольника. У этого есть две стороны:

Сокращение количества данных на вершину : Теперь, когда все ваши атрибуты вершины уже GL_SHORT s, следующая вещь, которую нужно продолжить, - это найти способ сделать то, что вы хотите, используя меньшее количество атрибутов или компонентов , Например, если вы можете жить без зеркального освещения, использование освещения DOT3 вместо освещения с фиксированной функцией OpenGL ES заменит ваши 3 шорта (+ 1 меньше отступа) для нормалей на 2 шорта для дополнительной координаты текстуры. В качестве дополнительного бонуса вы сможете освещать свои модели на пиксель.

Сокращение количества вершин, необходимых для каждого треугольника : При рисовании с индексированными треугольниками вы должны убедиться, что ваши индексы отсортированы для максимального повторного использования. Вероятно, здесь лучше всего использовать вашу геометрию с помощью инструмента PVRTTriStrip от Imagination Technologies.

4 голосов
/ 04 декабря 2009

Если у вас есть только 58 различных текстур 64x64, то текстурный атлас кажется хорошей идеей, поскольку все они поместились бы в одну текстуру 512x512 ... если вы не полагаетесь на режимы обтекания текстур, я бы определенно по крайней мере, попробуйте это.

В каком формате ваши текстуры? Вы можете попробовать использовать сжатую текстуру PVRTC; Я думаю, что это меньше загружает Tiler, и я был приятно удивлен качеством изображения даже для текстур с 2 битами на пиксель. (Хорошо для естественных изображений, плохо, если вы делаете что-то похожее на 8-битную видеоигру)

2 голосов
/ 07 декабря 2009

Самый большой выигрыш в графическом программировании сводится к следующему:

партия, партия, партия

TextureAtlasing будет иметь большее значение, чем все, что вы можете сделать. Переключение текстур похоже на остановку скоростного поезда, чтобы каждый раз пускать новых пассажиров.

Объедините все эти текстуры в атлас и значительно сократите количество ваших ничьих.

Этот веб-инструмент может быть полезен: http://zwoptex.zwopple.com/

2 голосов
/ 04 декабря 2009

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

Обновление после результатов инструментов:

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

1 голос
/ 10 декабря 2009

Чтобы попытаться преобразовать ваши текстуры в 16-битный формат RGB565, посмотрите этот код в почтенном Apple Texture2D.m, найдите kTexture2DPixelFormat_RGB565

http://code.google.com/p/cocos2d-iphone/source/browse/branches/branch-0.1/OpenGLSupport/Texture2D.m

(этот код загружает PNG и преобразует их в RGB565 во время создания текстуры; я не знаю, существует ли формат файла RGB565 как таковой)

Для получения дополнительной информации о сжатых текстурах PVRTC (которые выглядели намного лучше, чем я ожидал, когда я их использовал, даже при 2 битах на пиксель), см. Пример Apple PVRTextureLoader:

http://developer.apple.com/iPhone/library/samplecode/PVRTextureLoader/index.html

содержит код для загрузки текстур PVRTC в ваше приложение, а также инструкции по использованию texturetool для преобразования ваших файлов .png в файлы .pvr.

1 голос
/ 04 декабря 2009

Вы просматривали «Руководство по программированию OpenGL ES для iPhone OS» в центре разработки? В разделе «Лучшие практики для данных вершин и текстур» есть разделы.

Отформатированы ли ваши данные для использования треугольных полос?

С точки зрения наименьших усилий, последовательность изменений для вас, вероятно, будет:

  • Уменьшение размера атрибута вершины
  • О

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

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