Że mam model składa się z wierzchołków, z których każda position
, normal
, tangent
oraz texcoord
atrybutó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?
źródło
Odpowiedzi:
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ć:
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.
źródło
Może to zależeć od docelowego sprzętu i interfejsu API, którego będziesz używać. Czy możesz podać więcej informacji? Oto niektóre (bardzo ogólne i ogólne) najlepsze praktyki dotyczące OpenGL. https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices
Czy masz również problem z wydajnością? Czy jesteś po prostu ciekawy.
źródło