Скажем , у меня есть модель , составленная из вершин, каждый из которых position
, normal
, tangent
и texcoord
атрибутов, где треугольники указанных индексов троек.
Если мы просто сосредоточимся на атрибутах вершин, мне известны две широкие стратегии: структура массивов и массив структур. Я также слышал, что массив структур предпочтительнее, потому что он увеличивает локальность памяти (и, следовательно, локальность кэша) атрибутов для данной вершины.
Действительно ли это так, что это улучшает производительность? Основной способ, которым я мог думать, что это произойдет, - это индексы вершин, которые требуют, чтобы растеризатор получал данные вершин, которые давно были удалены из кэша. Если доступ к данным вершин является случайным, как это, то сохранение всех атрибутов вершины в одной и той же строке кэша, безусловно, ускорит процесс, но разве это не проблема, которую можно было бы в основном смягчить путем оптимизации порядка спецификации треугольника?
Кроме того, я понимаю, что современные графические процессоры могут лучше распаковывать длинные векторы одного типа, чем векторы структур многих типов. Возможно ли, чтобы компоновка структуры массивов последовательно превосходила компоновку массива структур тех же данных вершин, если порядок индекса оптимизирован?
источник
Ответы:
Извинения, я собирался добавить комментарий к вашей ветке вопросов, но обнаружил, что закончил слишком много. Мой опыт разработки с точки зрения DX 11, поэтому некоторые из них могут не сохраняться в OpenGL
Местность памяти данных, безусловно, играет важную роль. Но есть несколько других вещей, которые играют в этом, ширину данных, как вы знаете. У меня было несколько графических процессоров, и некоторые из них сильно пострадали из-за определенных переломных моментов. Это, например, на моем старом AMD r290, если я помню, вы могли бы в основном передать до 4 float4s через буфер вершин без дополнительных затрат, превышающих 1, но как только я отправил> 4, тогда произошло измеримое падение (в кадре ставка). Это чисто мое воспоминание и, как лучше всего, анекдотично. Но он считает, что архитектура GPU постоянно меняется, и какие нишевые технологии, которые дают вам преимущество в производительности сегодня, могут быть проклятием вашей производительности завтра. Я'
Сказав это, вы задали вопрос об упорядочении вершин, и, безусловно, это поможет незначительно. Повышение производительности происходит, когда вы комбинируете это с индексными буферами, что позволяет оборудованию оптимизировать и кэшировать уже рассчитанные вершины. Вы, конечно, можете получить еще больше прибыли от полос треугольника и т. Д., Которые специально заказаны согласно вашим мыслям. Большая часть рендеринга моделей - это оптимизированные модели на основе индексов / вершин с созданием экземпляров, я использую небольшое количество поисков для эффектов циклического движения (например, ветви дерева), в этих случаях вся ветвь дерева ищет одно и то же значение. Таким образом, кэширование может быть использовано и здесь.
Все, что я могу сказать в заключение от себя:
Это всего лишь несколько мыслей и переживаний, которые у меня были. Есть много книг, которые вы должны получить в руки по этим темам. Я не видел, чтобы многие прописывали то, что вы предлагаете, но это не значит, что это неправильно. Удачи.
источник
Это может зависеть от целевого оборудования и API, который вы собираетесь использовать. Можете ли вы предоставить больше информации? Вот некоторые (очень общие и общие) лучшие практики для OpenGL. https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices
Кроме того, у вас есть проблемы с производительностью? Или тебе просто любопытно.
источник