Generuję siatkę z danych wolumetrycznych za pomocą algorytmu Marching Cubes działającego na CUDA.Jak zoptymalizować VBO/IBO, aby zmaksymalizować wykorzystanie pamięci podręcznej GPU
Próbowałem zapisać siatkę i renderować ją na 3 sposoby.
- zapisać surowy zestaw trójkątów jako ciągła tablica danych wierzchołków. I oszacować wielkość jeśli pierwszy przebieg utwórz OpenGL VBO, mapę do CUDA i zapisywać dane wierzchołków do niej w formacie poniżej
V0x, V0y, V0z, N0x, N0y, N0z, V1x, V1y, V1z, N1x, N1y, N1z, ...
i wyciągnąć go za pomocą glDrawArrays()
.
Nadmiarowe wierzchołki w VBO, nadmiarowe wierzchołki na kostkę, brak indeksów.
- Take siatkę z etapu 1, używa
thrust::sort()
ithrust::unique()
usunąć nadmiarowe wierzchołki indeksy obliczeniowych przy użyciuthrust::lower_bound()
. zapisz wyniki do OpenGL VBO/IBO zmapowanego do CUDA. narysuj model za pomocąglDrawElements()
.
Brak nadmiarowych wierzchołków w VBO, wygenerowane indeksy.
- wygenerować unikalną listę wierzchołków na kostce, przechowywać je w VBO wraz z ich indeksów tworzących trójkąty w IBO. Renderuj przy użyciu
glDrawElements()
.
nadmiarowe wierzchołków VBO, Unikalne Wierzchołki na Cube, generowany Indeksy za Cube
Teraz FPS mam na tym samym zbiorze danych w tym samym ISO Wartość `jest
Method 1 : 92 FPS, 30,647,016 Verts, 0 Indices
Method 2 : 122 FPS, 6,578,066 Verts, 30,647,016 Indices
Method 3 : 140 FPS, 20,349,880 Verts, 30,647,016 Indices
Mimo że metoda 2 daje najmniejszą liczbę wierzchołków, FPS jest niski. Uważam, że dzieje się tak dlatego, że indeksy są w kolejności, która minimalizuje użycie pamięci podręcznej GPU. Kolejność Indeksów dla Metody 3 zwiększa użycie pamięci podręcznej GPU, stąd wyższy FPS.
Jak zmodyfikować/zmienić metodę 2, aby uzyskać wyższy współczynnik FPS?
czy metoda pomiaru FPS bierze pod uwagę czas potrzebny do usunięcia zbędnych wierzchołków za pomocą ciągu? –
@ m.s. Usuwanie odbywa się tylko raz. Nie szukam metody usuwania w czasie rzeczywistym.Kiedy wartość iso jest zmieniana, po prostu renderuję surową siatkę w Metodzie 1. Gdy zmiana jest stała, wtedy przetwarzam usuwanie, które trwa około 4 sekund. Potem używam VBO/IBO do renderowania siatki. Chcę wyższego FPS dla tej siatki, a tylko renderowanie, bez ekstrakcji i zagęszczania, gdy mierzę FPS. – Harish