Повышение производительности при использовании чередующихся массивов атрибутов в OpenGL4.0

Я работаю с OpenGL4.X. Недавно я прочитал этот Документ Apple OpenGLES2, в котором указано, что использование чередующихся массивов атрибутов повышает производительность на мобильных устройствах IOS и является рекомендуемым способом (вместо использования блоков атрибутов).

Для тех, кто не понял, что я имею в виду, вот пример:

Блок атрибутов в одном массиве атрибутов:

 float vertices[]{
//Triangle vertices:

v0x , v0y , v0z ,
v1x , v1y , v1z ,
v2x , v2y , v2z ,

//Triangle UVs:

uv0s , uv0t ,
uv1s , uv1t ,
uv2s , uv2t ,

//Triangle Normals:
n0x , n0y , n0z ,
n1x , n1y , n1z ,
n2x , n2y , n2z

}

Перемеженный массив атрибутов:

 float vertices[]{v0x , v0y , v0z ,
uv0s , uv0t ,          ////vertex 1 attributes
n0x , n0y , n0z ,

v1x , v1y , v1z ,
uv1s , uv1t ,         ///vertex 2 attributes
n1x , n1y , n1z ,

v2x , v2y , v2z ,
uv2s , uv2t ,         ///vertex 3 attributes
n2x , n2y , n2z

}

Итак, мой вопрос: верно ли это для OpenGL, работающего на настольных графических процессорах? Если да, то насколько теоретически может быть прирост производительности?

11

Решение

Верно ли это и для OpenGL, работающего на настольных графических процессорах?

От Вики-страница спецификации Vertex :

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


насколько теоретически может быть прирост производительности?

Я не могу действительно ответить на это, но я не ожидал бы огромного улучшения. Единственный верный способ — это измерить.

6

Другие решения

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

имеющий большой количество вершин с много атрибуты могут проявлять разницу в производительности. Значения большой а также много должно быть установлено путем профилирования.

4

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

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

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

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

4

Возможно, я ошибаюсь, но я считаю, что графическому процессору нужны данные (вершины, нормали и карты uv) при рендеринге, скажем, вершины треугольника, и если буфер для вершин, нормалей и uvmaps велик для объекта, например. большая сфера (визуализируется с помощью glvertex, а не glsphere) …

Графический процессор должен перемещаться по вершинам, нормалам и uvmaps, отображая небольшой прямоугольник, потому что он не может хранить все это в буфере внутри себя.

Связь по шине обычно медленнее, чем скорость процессора.

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

1
По вопросам рекламы [email protected]