Najbardziej wydajny sposób organizowania danych wierzchołków na nowoczesnych GPU


9

Że mam model składa się z wierzchołków, z których każda position, normal, tangentoraz texcoordatrybutów, gdzie trójkąty są określone przez trójek indeksu.

Jeśli skupimy się tylko na atrybutach wierzchołka, mam świadomość dwóch ogólnych strategii: struktury tablic i szeregu struktur. Słyszałem również, że tablica struktur jest preferowana, ponieważ zwiększa lokalizację pamięci (a tym samym lokalizację pamięci podręcznej) atrybutów dla danego wierzchołka.

Czy to naprawdę tak, że poprawia to wydajność? Mogę myśleć, że tak się stanie, głównie za pomocą indeksów wierzchołków, które wymagają od rasterizera uzyskania danych wierzchołków, które już dawno zostały eksmitowane z pamięci podręcznej. Jeśli dostęp do danych wierzchołków jest losowy, to zachowanie wszystkich atrybutów wierzchołka w tej samej linii pamięci podręcznej z pewnością przyspieszy sprawę, ale czy nie jest to problem, który można złagodzić, optymalizując kolejność specyfikacji trójkątów?

Co więcej, rozumiem, że współczesne procesory graficzne mogą być lepsze w rozpakowywaniu długich wektorów tego samego typu niż wektory struktur wielu typów. Czy wtedy byłoby możliwe, aby układ struktury tablic konsekwentnie przewyższał układ tablic struktur tych samych danych wierzchołków, jeśli kolejność indeksów jest zoptymalizowana?


4
Nie możesz po prostu wypróbować i przekonać się, który jest najszybszy w twojej sprawie?
user1118321

W przypadku siatek indeksowanych pomyślałbym, że tablica struktur byłaby bardziej wydajna, ponieważ moduł cieniujący wierzchołki będzie zasilany wszystkimi atrybutami wierzchołków, więc pogrupowanie ich w pamięci będzie bardziej przyjazne dla pamięci podręcznej.
PaulHK

W zależności od typów danych w strukturze, vec4 i zmiennoprzecinkowe ładnie się zestawiają, inne typy nie tak dobrze
PaulHK 11.01.19

2
@ user1118321 Podczas gdy indywidualne eksperymenty z testami porównawczymi są godną pochwały praktyką, z pewnością jest więcej długoterminowej wartości w szerszej dyskusji teoretycznej i być może wynikającej z ustanowienia ogólnych praktyk opartych na działaniu sprzętu do ciągnięcia wierzchołków.
Christian Rau

Odpowiedzi:


2

Przepraszam, chciałem dodać komentarz do wątku z pytaniem, ale okazało się, że skończyłem za dużo opracowywać. Moje doświadczenie programistyczne jest z perspektywy DX 11, więc niektóre z nich mogą nie mieć zastosowania w OpenGL

Lokalizacja pamięci danych z pewnością odgrywa istotną rolę. Ale jest kilka innych elementów, które mają wpływ na to, szerokość danych, jak wiesz. Miałem kilka procesorów graficznych i miałem uderzającą wydajność na niektórych w oparciu o pewne punkty krytyczne. Tak jest na przykład na moim starym AMD r290, jeśli pamiętam, można w zasadzie przekazać do 4 float4s do bufora wierzchołków bez dodatkowych kosztów powyżej 1, ale gdy opublikowałem> 4, nastąpił wymierny spadek (w ramce oceniać). Jest to całkowicie poza moim wspomnieniem, a więc jest jak najbardziej anegdotyczne. Ale utrzymuje się, że architektura GPU cały czas się zmienia, a jakie niszowe techniki, które dają dziś przewagę wydajności, mogą być zmorą wydajności jutro. JA'

Powiedziawszy to, zadałeś pytanie dotyczące zamawiania wierzchołków, a na pewno pomoże to marginalnie. Wzrost wydajności polega na połączeniu tego z buforami indeksu, co następnie pozwala sprzętowi zoptymalizować i buforować już obliczone wierzchołki. Z pewnością możesz uzyskać jeszcze więcej korzyści z pasków trójkątnych itp., Które zostały specjalnie uporządkowane według twoich myśli. Większość wykonywanego przeze mnie renderowania modeli to modele zoptymalizowane pod kątem indeksów / wierzchołków z instancjami, używam niewielkiej liczby odnośników do efektów ruchu cyklicznego (na przykład gałęzi drzewa), w takich przypadkach cała gałąź drzewa szuka tej samej wartości. Można więc również skorzystać z buforowania.

W podsumowaniu mogę tylko powiedzieć:

  • Staraj się nie przesadzać z optymalizacją na początku, podczas gdy wciąż rozwijasz swoją grę / aplikację, staraj się nie przedwcześnie optymalizować. Jeśli musisz wrócić i dodać nowe możliwości, możesz stracić cały wysiłek. Masz mój nawyk, może> <, uwielbiam próbować uzyskać najlepszą wydajność i techniki
  • Architektura GPU jest zróżnicowana, a mocne strony jednego mogą odzwierciedlać słabości drugiego. AMD i Nvidia słyną z zachęcania deweloperów do optymalizacji gier pod kątem ich architektury, z których każda ma swoje zalety / wady. Podjęcie środkowej drogi rozwoju może być najlepszym miejscem, nie korzystaj z funkcji opartych na dostawcy sprzętu (opinia tutaj). (dodaj do tego, niektóre spakowane formaty istnieją tylko w AMD).

To tylko kilka myśli i doświadczeń, które miałem. Istnieje wiele książek, które należy wziąć pod uwagę na te właśnie tematy. Nie widziałem wielu, którzy przepisują to, co proponujesz, ale to nie znaczy, że to źle. Powodzenia.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.