2015-07-05 27 views
5

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.

  1. 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.

  1. Take siatkę z etapu 1, używa thrust::sort() i thrust::unique() usunąć nadmiarowe wierzchołki indeksy obliczeniowych przy użyciu thrust::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.

  1. 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?

+1

czy metoda pomiaru FPS bierze pod uwagę czas potrzebny do usunięcia zbędnych wierzchołków za pomocą ciągu? –

+0

@ 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

Odpowiedz

1

Dwie rzeczy mogą pomóc:

  • próbując zoptymalizować wykorzystanie pamięci podręcznej danych poprzez umieszczenie wierzchołki mniej więcej w kolejności będzie je
  • narysować próby optymalizacji post transform cache użycia (jest algorytm to zrobić here , a implementacje można prawdopodobnie znaleźć w sieci)
+0

Dzięki @Jerem, spróbuję tego algorytmu [Fast Vertex Cache Opt] (https://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html). Zaktualizuje, jak się okaże. Chciałbym znaleźć jakiś algorytm, który wykorzystuje mniej pamięci, jak to możliwe, ponieważ moje rozmiary oczek stają się naprawdę duże. – Harish

+0

Próbowałem wdrożenia procesora powyższego algorytmu, działa, ale jest zbyt wolny. Zajęło to ponad 12 sekund dla siatki 60K, moje oczka są większe niż 20 M, a nie jest to możliwe dla siatki o takim rozmiarze. Poszukuje rozwiązania skalowalnego do GPU. – Harish

+0

Czy próbowałeś posortować wierzchołki w kolejności ich rysowania? – Jerem