Подтвердить что ты не робот

GL_TRIANGLES или GL_TRIANGLE_STRIP на iOS?

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

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

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

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

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

4b9b3361

Ответ 1

TBH Я бы поверил 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) некоторые сложные сетки могут быть быстрее, чем с полосками. Добавьте к этому тот факт, что в неиндексированной полосе каждая повторяющаяся вершина должна быть отправлена ​​полностью, объем данных, которые необходимо отправить, может быть LOT выше, чем сумма, которую нужно отправить в индексированном списке (поскольку каждая вершина отправляется только один раз, а повторение выполняется в гораздо более компактных индексах).

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

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