Я работаю с 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, работающего на настольных графических процессорах? Если да, то насколько теоретически может быть прирост производительности?
Верно ли это и для OpenGL, работающего на настольных графических процессорах?
От Вики-страница спецификации Vertex :
Как правило, вы должны использовать чередующиеся атрибуты, где это возможно. Очевидно, что если вам нужно изменить некоторые атрибуты, а не другие, то чередование тех, которые меняются, с теми, которые не меняются, не является хорошей идеей.
насколько теоретически может быть прирост производительности?
Я не могу действительно ответить на это, но я не ожидал бы огромного улучшения. Единственный верный способ — это измерить.
Преимущество чередующихся массивов атрибутов заключается в локальности памяти. Это означает, что все необходимые данные вершин расположены рядом друг с другом и могут быть извлечены более эффективно по сравнению с данными, расположенными в нескольких буферах.
имеющий большой количество вершин с много атрибуты могут проявлять разницу в производительности. Значения большой а также много должно быть установлено путем профилирования.
Для того чтобы любой Оптимизация для увеличения производительности, она должна сначала оптимизировать что-то, что является производительностью горлышко бутылки. Если в настоящее время это не является узким местом, то что-либо с этим не обязательно улучшит производительность.
Невозможно ответить на ваш вопрос, потому что любой выигрыш в производительности в первую очередь зависит от того, находитесь ли вы в узком месте в производительности передачи вершин (то есть: что это оптимизирует). Если вы на самом деле не слишком сильно толкаете свою видеокарту, чтобы проблемы с вершинным шейдером, фрагментным шейдером и процессором не стали узкими местами, это не будет иметь значения.
И нет никакого способа узнать, насколько это выгодно, потому что разные аппаратные средства будут реагировать по-разному. Различные ситуации будут реагировать по-разному в зависимости от того, насколько узким является узкое место.
Просто чередуйте свои атрибуты. Это ничего не стоит, требует минимальных затрат времени и усилий и может иметь нетривиальную ценность с точки зрения производительности.
Возможно, я ошибаюсь, но я считаю, что графическому процессору нужны данные (вершины, нормали и карты uv) при рендеринге, скажем, вершины треугольника, и если буфер для вершин, нормалей и uvmaps велик для объекта, например. большая сфера (визуализируется с помощью glvertex, а не glsphere) …
Графический процессор должен перемещаться по вершинам, нормалам и uvmaps, отображая небольшой прямоугольник, потому что он не может хранить все это в буфере внутри себя.
Связь по шине обычно медленнее, чем скорость процессора.
Теперь, в этом случае чередующиеся массивы являются большим преимуществом и уменьшают обмен данными по шине, и графический процессор может легко обрабатывать чередующиеся массивы и будет иметь все данные, доступные для конкретного набора визуализируемых вершин.