Ответ 1
VAOs
-
Для совместного использования больших наборов данных специальный буфер, содержащий один массив вершин (атрибут), безусловно, способ пойти, в то время как все еще можно чередовать определенные массивы в другом буфере и объединить их с помощью VAO.
-
VAO обрабатывает привязку всех этих буферов и состояний массива вершины (атрибута), таких как привязки буфера массива и атрибутов записей с указателями (буфера) и флаги включения/выключения. Помимо удобства, он предназначен для быстрого выполнения этой задачи, не говоря уже о простом вызове API, который сразу меняет все состояния, без утомительного включения и отключения массивов атрибутов. Это в основном делает то, что мы должны были делать вручную раньше. Тем не менее, с моей собственной реализацией, подобной VAO, я не мог измерить потерю производительности даже при выполнении большого количества привязок. С моей точки зрения, основным преимуществом является его удобство.
Таким образом, VAO не принимает решения о производительности в плане glDraw *, но может повлиять на накладные расходы изменений состояния.
Форматы данных с чередованием...
-
... вызывают меньшее давление кеша GPU, поскольку координаты вершин и атрибуты одной вершины не разбросаны по всей памяти. Они последовательно помещаются в несколько строк кеша, в то время как разбросанные атрибуты могут вызвать больше обновлений кеша и, следовательно, выселения. В худшем случае сценарий может быть одним (атрибутом) элементом на каждую строку кэша за раз из-за отдаленных мест памяти, в то время как вершины вытягиваются не детерминированным/несмежным образом, где, возможно, не прогнозируется и не предваряется. Графические процессоры очень подобно процессорам в этом вопросе.
-
... также очень полезны для различных внешних форматов, которые удовлетворяют устаревшим чередующимся форматам, где наборы данных совместимых источников данных может считываться прямо в карту памяти GPU. Я в конечном итоге перепрограммировал эти чередующиеся форматы с текущим API по этим причинам.
-
... должен быть совместим с выравниванием, как простые массивы. Для микширования различных типов данных с различными требованиями к размеру/выравниванию может потребоваться отступы для обеспечения совместимости с графическим процессором и ЦП. Это единственный недостаток, о котором я знаю, из более сложной реализации.
-
... не мешает вам указывать на отдельные массивы атрибутов в них для совместного использования.
Чередование, скорее всего, улучшит производительность при рисовании.
Вывод:
Из того, что я испытал, лучше всего иметь чисто разработанные интерфейсы для источников данных вершин и "скомпилированных" VAO, где можно инкапсулировать VAO factory соответствующим образом. Этот factory может быть изменен для инициализации перемежающихся, отдельных или смешанных вершинных макетов буфера из источников данных, не нарушая ничего. Это особенно полезно для профилирования.
После всего, что лепит, мой совет прост: правильная и достаточно абстрактная конструкция до и для оптимизации.