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.
źródło
Odpowiedzi:
Wyobraźmy sobie dużą siatkę siatki, taką jak ta, której moglibyśmy użyć w terenie. Będziemy renderować jego
n
tró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/2
wierzchołki.Aby to zrobić, musimy:
Uruchom moduł cieniujący wierzchołki przynajmniej
n/2
raz(„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)
n
Tró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
3n
do renderowania wierzchołki, sześć razy więcej niż wcześniej! Nasze kroki to ...Uruchom
3n
czasy 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)
n
Tró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.
źródło
Ani.
O ile nie mówisz naprawdę ogromnej liczby tris (milionów), zależy ci na:
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).
źródło
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.
źródło