2010-06-29 2 views
3

Я бы хотел услышать, что люди думают, что оптимальные призывы к обращению для Open GL ES (на iphone).Минимизация вызовов glDrawArray в OpenGl es

В частности, я читал во многих местах, что лучше всего свести к минимуму количество вызовов glDrawArrays/glDrawElements - я думаю, что Apple говорит, что 10 должны быть максимальными в их недавнем представлении WWDC. Как я понимаю, для этого вам нужно поместить все вершины в один массив, если это возможно, поэтому вам нужно только один раз вызвать вызов drawArrays.

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

Кроме того, разве это не означает, что вы не можете использовать какие-либо настройки вентилятора/полосы, если только у вас нет непрерывной формы?

Эти недостатки заставляют меня думать, что я не понимая, что-то правильно, так что я предполагаю, что я ищу подтверждение того, что я должен:

  • пытается сделать убер массив всех треугольников рисовать.
  • Смиритесь с тем, что мне придется самому выработать все вершинные позиции.
  • Забудьте о push'ing и pop'ing каждую вещь, чтобы привлечь в это нужное место

Это то, что делают другие?

Благодаря

ответ

8

Обширный вопрос, пакетирование всегда вопрос компромисса.

Идеальная структура для производительности будет, как вы упомянете, одному массиву, содержащему все треугольники для рисования.

Начиная отсюда, мы можем начать добавлять ограничения:

  • Еще одно ограничение состоит в том, что имеющие индексы вершин в 16bits сохраняет пропускную способность и память, и, вероятно, быстрый путь для вашей платформы. Итак, вы можете рассмотреть группировку треугольников в кусках 65536 вершин.

  • Затем, если вы хотите, чтобы переключить шейдер/материал/glState используется для рисования геометрию, у вас нет выбора (*), но испускать один вызов отрисовки в шейдер/материал/glState. Таким образом, группировка треугольников может рассматривать группировку по shaderID/materialID/glStateID.

  • Далее, если вы хотите, чтобы оживить вещи, у вас нет выбора (*), но передавать ваши матрицы преобразования для GL, , а затем выдать вызов отрисовки. Так группировка треугольников могли бы рассмотреть группировку треугольников «преобразующих групп», например, все статические геометрия вместе, анимированный геометрия , которые имеют общие преобразования могут быть сгруппированы тоже.

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

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

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

HTH, веселит,


(*) на самом деле есть методы, позволяющие уменьшить количество вызовов отрисовки в этих случаях, таких как:

  • texture atlases группировать различные текстуры в одном, чтобы предотвратить переключение текстур в GL, таким образом , позволяющий ограничивать обратные вызовы

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

  • ...

+0

отличный ответ на очень широкий вопрос. – Dad

+1

Я кодирую в основном 2d-приложения (спрайты), поэтому общее количество вершин довольно низкое, но количество спрайтов может быть довольно высоким, и я использую призыв рисования для спрайта. Тем не менее, я только замечаю, что на сегодняшний день достигнуты показатели производительности. Я хотел бы максимально упорядочить мои спрайты (уже используя атласы, одиночные шейдеры), но мне интересно, какие затраты на восстановление VBO/VAO/IBO каждого кадра для объектов, которые движутся независимо. –