Найефективніший спосіб організації даних вершин на сучасних графічних процесорах


9

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

Якщо ми просто зосередимось на атрибутах вершини, я знаю про дві широкі стратегії: структура масивів та масив структур. Я також чув, що масив структур є кращим, оскільки він збільшує локальність пам'яті (і, отже, кеш-локальність) атрибутів для даної вершини.

Чи дійсно так, що це покращує продуктивність? Основний спосіб, з якого я можу подумати, що це станеться, - це вершинні індекси, які вимагають від растеризатора отримати вершинні дані, які давно були виселені з кешу. Якщо доступ до вершинних даних є випадковим, як це, то збереження всіх атрибутів для вершини в одній лінії кешу, безумовно, полегшить ситуацію, але хіба це не проблема, яку в основному можна пом'якшити шляхом оптимізації порядку специфікації трикутника?

Крім того, я розумію, що сучасні GPU можуть краще розпакувати довгі вектори одного типу, ніж вектори структур багатьох типів. Чи можливо тоді компонування структури масивів послідовно перевершувати структуру масиву структур з одних і тих самих даних вершин, якщо оптимізовано порядок індексів?


4
Не могли б ви просто спробувати його і побачити, який найшвидший для вашого випадку?
користувач1118321

Я б подумав для індексованих сіток, що масив структур буде ефективнішим, оскільки шейдер вершин буде живитись усіма атрибутами вершин, тому їх об’єднання в пам’ять стане кешем.
PaulHK

Залежно від типів даних у структурі, vec4s та floats добре поєднуються, інші типи не так добре
PaulHK

2
@ user1118321 Хоча окремі експерименти з бенчмаркінгу є похвальною практикою, безумовно, є більш тривала цінність у більш широкій теоретичній дискусії і, можливо, в результаті встановлення загальних практик на основі того, як працює апаратне забезпечення вершин.
Крістіан Рау

Відповіді:


2

Вибачте, я збирався додати коментар до вашої теми запитання, але виявив, що закінчив занадто багато. Мій досвід розробки є з точки зору DX 11, тому щось із цього може не бути в OpenGL

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

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

Все, що я можу сказати в підсумку, це:

  • Намагайтеся не переосмислювати оптимізацію на початку, тоді як ваша ще розвиваюча гра / додаток намагайтеся не передчасно оптимізувати. Якщо вам потрібно повернутися і додати нові можливості, ви можете втратити всі зусилля. Можливо, ти маєш мою звичку любити намагатися досягти найкращих показників та прийомів
  • Архітектури GPU різноманітні, і сильні сторони однієї можуть відображати слабкі місця в іншій. AMD та Nvidia відомі тим, що розробники розробляють для оптимізації ігор під їх архітектуру, тому кожен має свої переваги / недоліки. Середня дорога розвитку може бути найкращим місцем, не використовуйте жодних функцій на основі постачальників обладнання (думка тут). (додайте до цього, деякі упаковані формати існують лише в AMD).

Це лише кілька думок і переживань, які я мав. Існує багато книг, які вам слід обійтися навколо цих самих тем. Я не бачив, щоб багато хто прописував, що ви пропонуєте, але це не означає, що це неправильно. Удачі.


1

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

Також у вас є проблеми з продуктивністю? Або ти просто цікавий.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.