OpenGL на Android против iOS: оптимизация и где они различаются

Я кодирую приложение OpenGL ES 1.1 для Android и iPhone. Механизм OpenGL ES живет в общей библиотеке и доступен через NDK на Android.

Я хочу оптимизировать свою производительность OpenGL. Там много видео и ресурсов, например:

http://www.vizworld.com/2010/02/ngmocos-tim-omernick-optimizing-opengl-iphone/

http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Performance/Performance.html#//apple_ref/doc/uid/TP40008793-CH105

http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html

OpenGL ES 2.0: поиск рекомендаций по оптимизации/оптимизации VBO для многих перемещаемых вершин

Когда VBOs быстрее, чем "простые" OpenGL-примитивы (glBegin())?

https://gamedev.stackexchange.com/info/1068/opengl-optimization-tips

Но обычно существуют общеизвестные методы, которые применяются повсеместно, например:

  • Использовать объекты буфера вершин (VBOs)
  • Сведение к минимуму изменений состояния OpenGL
  • Использовать текстурирование, чтобы избежать необходимости выбирать различные текстуры.

Некоторые методы являются или могут быть более чувствительными по своей специфике и могут отличаться от Android и iPhone, и что меня интересует. Например:

  • Перемещайте данные вершин внутри каждой вершины: например, вершинная координация; координация текстуры; нормальный. Есть ли предпочтительный порядок элементов в перемежении?
  • Разложите каждую вершину на следующую кратность некоторого количества байтов. Я вижу, что число 32 связано, но также есть 4 или 8 в некоторых местах.
  • Рассмотрите возможность использования короткой или аналогичной для каждой координаты Вершины, а не float

Итак, мой вопрос: каковы более тонкие детали волшебных оптимизаций, таких как последний список выше, который отличается от Android и iPhone? Где они отличаются, какова лучшая стратегия? Просто используйте значение, которое подходит для обоих миров? (Точная настройка таких деталей во время выполнения в зависимости от платформы может быть немного выше)?

Ответ 1

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

  • Частота и пропускная способность памяти мобильных графических процессоров значительно ниже, чем у настольных монстров. Было бы разумно сократить доступ и доступ к текстурам, насколько это возможно. Рассмотрите возможность использования алгоритмов и методов удаления скрытой поверхности на уровне процессора.

  • Используйте профилировщики, специфичные для поставщиков, для точной настройки кода для определенных фишек. Используйте разные пути кода, если производительность значительно варьируется от поставщика к поставщику.

  • Еще раз, заполнение на мобильных устройствах имеет значение. Используйте меньшие типы данных, меньше выборки текстур. Это особенно верно для дисплея сетчатки Apple на новом iPad. Предпочитайте вычисления по текстурным поискам для разумных формул (вы должны профиль).