Самый эффективный способ организации вершинных данных на современных графических процессорах

9

Скажем , у меня есть модель , составленная из вершин, каждый из которых position, normal, tangentи texcoordатрибутов, где треугольники указанных индексов троек.

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

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

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

lcmylin
источник
4
Не могли бы вы просто попробовать и посмотреть, какой самый быстрый для вашего случая?
user1118321
Я бы подумал для индексированных сеток, что массив структур будет более эффективным, поскольку вершинный шейдер будет получать все атрибуты вершины, поэтому их сгруппирование в памяти будет более удобным для кеша.
PaulHK
В зависимости от типов данных в структуре, vec4s и float хорошо упаковываются, другие типы не очень хорошо
PaulHK
2
@ user1118321 Несмотря на то, что отдельные эксперименты по сравнительному анализу являются похвальной практикой, в более широком теоретическом обсуждении, безусловно, есть более долгосрочная ценность, и, возможно, это приведет к установлению общих практик, основанных на том, как работает аппарат для извлечения вершин.
Кристиан Рау

Ответы:

2

Извинения, я собирался добавить комментарий к вашей ветке вопросов, но обнаружил, что закончил слишком много. Мой опыт разработки с точки зрения DX 11, поэтому некоторые из них могут не сохраняться в OpenGL

Местность памяти данных, безусловно, играет важную роль. Но есть несколько других вещей, которые играют в этом, ширину данных, как вы знаете. У меня было несколько графических процессоров, и некоторые из них сильно пострадали из-за определенных переломных моментов. Это, например, на моем старом AMD r290, если я помню, вы могли бы в основном передать до 4 float4s через буфер вершин без дополнительных затрат, превышающих 1, но как только я отправил> 4, тогда произошло измеримое падение (в кадре ставка). Это чисто мое воспоминание и, как лучше всего, анекдотично. Но он считает, что архитектура GPU постоянно меняется, и какие нишевые технологии, которые дают вам преимущество в производительности сегодня, могут быть проклятием вашей производительности завтра. Я'

Сказав это, вы задали вопрос об упорядочении вершин, и, безусловно, это поможет незначительно. Повышение производительности происходит, когда вы комбинируете это с индексными буферами, что позволяет оборудованию оптимизировать и кэшировать уже рассчитанные вершины. Вы, конечно, можете получить еще больше прибыли от полос треугольника и т. Д., Которые специально заказаны согласно вашим мыслям. Большая часть рендеринга моделей - это оптимизированные модели на основе индексов / вершин с созданием экземпляров, я использую небольшое количество поисков для эффектов циклического движения (например, ветви дерева), в этих случаях вся ветвь дерева ищет одно и то же значение. Таким образом, кэширование может быть использовано и здесь.

Все, что я могу сказать в заключение от себя:

  • Старайтесь не задумываться об оптимизации с самого начала, пока вы все еще разрабатываете свою игру / приложение, старайтесь не преждевременно оптимизировать. Если вам нужно вернуться и добавить новые возможности, вы можете потерять все усилия. У тебя есть моя привычка, может быть,> <, люблю пытаться получить лучшую производительность и технику
  • Архитектура GPU разнообразна, и сильные стороны одного могут отражать слабые стороны другого. AMD и Nvidia известны разработчиками для оптимизации игр под свою архитектуру, поэтому у каждого есть свои преимущества и недостатки. Лучше всего пойти по срединному пути развития, не используйте какие-либо аппаратные функции, предоставляемые вендорами (мнение здесь). (добавьте, что некоторые упакованные форматы существуют только в AMD).

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

ErnieDingo
источник
1

Это может зависеть от целевого оборудования и API, который вы собираетесь использовать. Можете ли вы предоставить больше информации? Вот некоторые (очень общие и общие) лучшие практики для OpenGL. https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices

Кроме того, у вас есть проблемы с производительностью? Или тебе просто любопытно.

i.terrible
источник