GL_TRIANGLES или GL_TRIANGLE_STRIP на iOS? - PullRequest
16 голосов
/ 15 декабря 2010

В этом документе (документация Apple по iOS для OpenGL) Apple рекомендует использовать треугольники с полосами над (проиндексированными) треугольниками в OpenGL ES на iOS:

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

Однако Imagination Technologies (создатели графического чипа, который используется в устройствах iOS) предлагают обратный подход в этом документе (Рекомендации по разработке приложений POWERVR 3D). Они специально пишут на странице 11:

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

Мой вопрос: кто прав? Или я неправильно понимаю какой-либо документ?

1 Ответ

13 голосов
/ 15 декабря 2010

ТБХ Я бы поверил, что powerVR.PowerVR поддерживает кэш после преобразования.Этот кеш означает, что индексы, которые повторяются относительно близко к месту последнего вызова, могут полностью избежать повторного преобразования (он просто вытаскивает уже преобразованное значение из кеша).Так что в случае полосы, которая идет 0, 1, 2, 3, 4, 5, 6, 7, она не дает никакого бонуса, но на самом деле полосы не так просты.Там будет некоторое повторное использование индекса вершины.Это повторное использование может полностью избежать преобразования.Если полосы оптимизированы, чтобы учесть это (см. Библиотеку NVTriStrip !), Вы можете получить МАКСИМАЛЬНО улучшенную производительность, так как многие преобразования просто не будут выполняться.

Более того, дополнительный бонусэто означает, что списки треугольников больше не являются помехой производительности, так как 2 из вершин, которые вы собираетесь преобразовать в кэше ARE, и, следовательно, не влияют на производительность (кроме загрузки 6 байтов на треугольник, а не 2 (ish), чтоне так много в грандиозной схеме вещей).Кроме того, поскольку вам не нужно выполнять «перезапуски» полосы (перезапуск выполняется путем повторения последнего индекса последнего треугольника и первого индекса следующего треугольника. Т. Е. 0,1,2,2,3,3,4,5,6) некоторые сложные сетки могут быть быстрее, чем с полосками.Добавьте к этому тот факт, что в неиндексированной полосе каждая повторяющаяся вершина должна быть отправлена ​​целиком вниз, количество данных, которые должны быть отправлены, может быть НАМНОГО больше, чем количество, которое необходимо отправить в индексированном списке (как каждая вершина).отправляется только один раз, а повторение выполняется в гораздо более компактных индексах.

Конечно, MBX (iPhone 3G) не поддерживает пост-преобразование кэшей, что, скорее всего, является следствием совета Apple.SGX (iPhone 3GS и выше), тем не менее, зависит от того, какое оборудование вы хотите использовать.Если у вас все в порядке, ориентируясь на 3GS и выше, используйте индексацию, в противном случае - нет.Конечно, поддержка обоих методов «из коробки» даст лучшую производительность на обеих платформах.

Конечно, лучший способ увидеть это - попробовать оба метода (это не займет много времени) и посмотреть, какиелучше работает на оборудовании !!

...