Budżet modeli 3D. Liczy się większa liczba trójkątów lub wierzchołków

12

Kiedy robię model do gry 3D, co powinienem mierzyć w moim budżecie Wielokąty (trójkąty) lub wierzchołki? Zrobiłem eksperyment z dwoma zestawami 40000 sześcianów, jeden z 8 wierzchołkami i 12 trójkątami, drugi z 24 wierzchołkami i 12 trójkątami. Wszystko zostało zrobione w Unity i oba zostały wygenerowane proceduralnie. Ku mojemu zdziwieniu oba zestawy działały prawie tak samo, między nimi była bardzo mała różnica.

Czy to oznacza, że ​​nie powinienem martwić się liczbą wierzchołków i patrzeć tylko na liczbę trójkątów?

EDYCJA: Zrobiłem kolejny eksperyment. Stworzyłem płaszczyznę z 19602 trójkątami i 10000 wierzchołkami oraz kolejny z taką samą ilością trójkątów, ale 39204 wierzchołkami. Wygenerowałem 4000 obu. Teraz mniej wierzchołków wygrywało 14 fps do 19 fps. Myślę, że ogólnie mniej znaczy lepiej, ale tylko w dużych różnicach.

Michał Leszczyński
źródło
9
Napisz swoją grę i napraw problemy w miarę ich pojawiania się. Tego rodzaju problem może nigdy się nie pojawić, a ty marnujesz swój czas: P
Vaillancourt

Odpowiedzi:

16

Wyobraźmy sobie dużą siatkę siatki, taką jak ta, której moglibyśmy użyć w terenie. Będziemy renderować jego ntrójkąty, obejmujące na przykład połowę naszego ekranu 1080p, w jednym losowaniu.

Jeśli spawamy wszystkie nasze wierzchołki i nie mamy szwów wygładzających / teksturujących, to każdy trójkąt ma 3 wierzchołki, a każdy wierzchołek jest wspólny dla 6 trójkątów, więc mamy n/2wierzchołki.

Aby to zrobić, musimy:

  • Uruchom moduł cieniujący wierzchołki przynajmniej n/2raz

    („przynajmniej”, ponieważ nasza pamięć podręczna dla wyników wierzchołków jest tylko tak duża. Czasami skończymy eksmitacją wierzchołka, który już przekształciliśmy, a następnie potrzebujemy go ponownie dla późniejszego trójkąta, który go dzieli, i dlatego ponownie uruchom na nim moduł cieniujący wierzchołek Tak więc nie uzyskujemy tak dużych oszczędności, jak to wygląda na papierze)

  • nTrójkąty Clip & Cull .

  • Rasteryzuj i interpoluj co najmniej 1920x1080 / 2 lub około 1 miliona pikseli bufora ramki (ponieważ powiedzieliśmy, że nasz teren obejmuje około połowy ekranu).

    („przynajmniej” ze względu na sposób, w jaki GPU działają na poczwórnych pikselach , niektóre fragmenty tuż poza krawędziami wielokątów są nadal rasteryzowane, ale następnie maskowane, co oznacza, że ​​przetwarzamy fragmenty dwa razy. W przypadku nierównej siatki otrzymamy również overdraw gdziekolwiek zamyka się, jeśli nie mamy szczęścia, aby najpierw narysować wielokąt z przodu do bufora głębokości)

  • Uruchom moduł cieniujący fragmenty dla wszystkich> = 1 milion fragmentów.

  • Połącz ~ 1 milion wyników z buforami ramki i głębokości.

Okej, teraz rozwińmy wszystkie nasze wierzchołki, więc teraz mamy 3ndo renderowania wierzchołki, sześć razy więcej niż wcześniej! Nasze kroki to ...

  • Uruchom 3nczasy cieniowania wierzchołków .

    (Brak gwiazdek z powodu buforowania, ponieważ każdy wierzchołek jest używany tylko raz, ale to oznacza, że ​​pamięć podręczna nie może nas uratować w żadnym momencie)

  • nTrójkąty Clip & Cull .

  • Rasteryzuj i interpoluj co najmniej 1920 x 1080/2 lub około 1 miliona pikseli bufora ramki.

  • Uruchom moduł cieniujący fragmenty dla wszystkich> = 1 milion fragmentów.

  • Połącz ~ 1 milion wyników z buforami ramki i głębokości.

... czekaj, każdy krok oprócz pierwszego jest taki sam! Dlatego większość pracy wykonywanej przez GPU w typowym wywołaniu losowania nie jest bezpośrednio związana z liczbą użytych wierzchołków. Zasięg ekranu, overdraw i całkowita liczba trójkątów stanowią znacznie więcej kosztów.

To nie znaczy, że wierzchołki są całkowicie wolne. Jeśli dzielisz wierzchołki, kiedy możesz, możesz uzyskać skromne oszczędności z buforowania, szczególnie jeśli twoje shadery wierzchołków są skomplikowane lub potok wierzchołków twojego sprzętu jest słaby (jak miało to miejsce w niektórych starszych konsolach). Ale biorąc pod uwagę, że liczba wierzchołków śledzi proporcjonalnie do liczby trójkątów plus lub minus stały współczynnik, zwykle nie jest to tak interesująca metryka całkowitego kosztu siatki.

DMGregory
źródło
Co z kosztem wysłania tych wierzchołków do pamięci?
Michał Leszczyński,
7
O ile nie zmieniasz bufora wierzchołków w każdej ramce, jeden raz płacisz ten koszt przesyłania. Twoje tekstury i bufor ramki są prawdopodobnie większymi obszarami pamięci wideo i przepustowości w obrębie dowolnej klatki. To wciąż oznacza, że ​​wierzchołki z pewnością nie są wolne i lepiej jest je udostępniać, gdy jest to praktyczne, ale niewykorzystane wierzchołki rzadko, jeśli w ogóle, są przyczyną słabej wydajności gry.
DMGregory
Dodam do tego, ponieważ robię lasy itp. W mojej grze. Kiedy zaczynałem, początkowo używałem wywołań losowania (używam własnego silnika, może to nie do końca pasować do twojego pytania), aby rysować modele tylko z wierzchołkami, to samo w sobie było w porządku, wydajność była dobra. Ale kiedy zacząłem używać indeksowania, uzyskałem poprawę wydajności, ponieważ niektóre wierzchołki były współdzielone i tak buforowane, więc niektóre obliczenia nie zostały wykonane dwukrotnie. Najważniejsze jest to, że sam surowy test wierzchołków nie jest najlepszym wskaźnikiem wierzchołków w porównaniu do liczby zliczeń. Zbyt wiele z nich może mieć wpływ na twój rurociąg. Jak wskazują inne odpowiedzi.
ErnieDingo,
2

Ani.

O ile nie mówisz naprawdę ogromnej liczby tris (milionów), zależy ci na:

  • Liczba renderowanych pikseli
  • Koszt shadera fragmentów
  • Liczba losowań (z limitem silnie zależnym od urządzenia).

24 wierzchołki razy 4000 kostek daje 96'000 wierzchołków.

640x380 pikseli daje 243'200 fragmentów, a większość urządzeń obsługuje znacznie większe rozdzielczości.

Możesz ponownie uruchomić eksperyment z 1'000'000 kostek, partiami, aby uniknąć wąskiego gardła wywołania losowania (1 pojedynczy model na 1'000 kostek).

Piotr
źródło
2
To bardzo zależy od sceny i sposobu renderowania. Jeśli masz scenę, która naturalnie ma stosunkowo niewielkie przerysowanie, przetwarzanie wierzchołków z pewnością może zdominować Twoją wydajność. Ponadto liczba wywołań losowania nie jest problemem (w przypadku niektórych interfejsów API), a jedynie stanem zmian między wywołaniami losowania.
Nicol Bolas,
1

Warto zauważyć, że jeśli robisz aplikację WebGL, liczba wierzchołków szybko staje się wąskim gardłem pod względem wielkości pliku do pobrania przez użytkowników. Taka sama liczba trójkątów, ale często 2-3 razy więcej wierzchołków niż pokazano w oprogramowaniu DCC. Lepsze rozpakowywanie może bardzo pomóc w tym przypadku, ponieważ ma mniej szwów.

Francisco Toledo
źródło