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