Повышение производительности при использовании чередующихся массивов атрибутов в 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, работающего на настольных графических процессорах? Если да, то насколько теоретически может быть прирост производительности?

4 ответа

Решение

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

На странице спецификации Vertex:

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


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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам