Минимизация вызовов glDrawArray в OpenGl es - PullRequest
3 голосов
/ 29 июня 2010

Мне бы хотелось услышать, что люди думают, что оптимальные колл-колы для Open GL ES (на iphone).

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

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

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

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

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

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

Спасибо

1 Ответ

8 голосов
/ 17 января 2011

Большой вопрос, пакетирование - это всегда вопрос компромисса.

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

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

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

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

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

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

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

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

HTH, ура,


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

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

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

  • ...

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