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

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

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

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

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

Ответ 1

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

Из Вики-страница спецификации вершин:

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


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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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