glDrawElements против эффективности glDrawArray - PullRequest
6 голосов
/ 13 июля 2011

Я делаю игру для iOS и Android.Я видел во многих местах, что рисование с использованием индексов более эффективно, чем просто рисование массива треугольников.

Дело в том, что я использую сжатые вершины с потерями (например, формат файла md2), и это занимает меньшечем только индексы - Массив: N * 3 (xyz) * 1 (uchar) + перевод (12 байт) + масштаб (12 байт).Элемент: N * 3 (xyz) * 4 (uint) + Array / ~ 10

Кажется, что массив является даже лучшим выбором, чем индексированный и сжатый элемент, хотя инструмент профилирования Apple OpenGL говорит, что я должениспользовать glDrawElements ..

Предпочитает ли реализация OpenGL индексированный массив?или это потому, что индексированный массив содержит меньше данных, чем обычный несжатый массив?

ps Я использую OpenGL es 2.0, а вершинный шейдер - это тот, кто распаковывает вершины.

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

Используете ли вы Vertex Arrays или Vertex Buffer Objects? Если вы используете Vertex Arrays, вы можете рассмотреть glDrawRangeElements, а не glDrawElements.

Если у всех ваших полисов нет отдельных вершин (что маловероятно), glDrawElements будет быстрее, чем glDrawArray, потому что glDrawElements будет использовать тот факт, что повторяющиеся вершины будут загружены в кэш GPU, и не будет должны быть загружены более одного раза для каждого поли, частью которого является эта вершина. Однако при glDrawArray он будет перебирать массив и не сможет связать похожие вершины, поэтому ему придется загружать их несколько раз.

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

Помните, преждевременная оптимизация - корень всего зла. Удачи! :)

1 голос
/ 13 июля 2011

Использование glDrawElements() сэкономит значительный объем памяти, и вы можете указывать элементы массива в любом порядке.

Используя glDrawArrays(), однако, вы можете только последовательно выполнять итерации по списку.

Вы должны экспериментировать.

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