Jaka jest techniczna definicja „grupowania duszka”?

17

Platforma i język agnostycznie, w jaki sposób definiuje się grupowanie duszków? Wygląda na to, że istnieje wiele różnych technik zmniejszania ilości pracy podczas rysowania i że często są one łączone z „grupowaniem”. Przyszło mi do głowy, że może nie być prawdziwej odpowiedzi, ale być może ktoś tu znalazł coś, czego ja nie znalazłem.

Bloodyaugust
źródło

Odpowiedzi:

14

Technicznie rzecz biorąc, „grupowanie” polega na umieszczeniu wielu działań i ich danych w jednej strukturze danych, aby wszystko można było wykonać jednocześnie, a nie pojedynczo.

Największym wąskim gardłem współczesnych układów GPU nie jest ich moc robocza, ale komunikacja między grą uruchomioną na procesorze a GPU. Każdy pakiet danych wysyłanych do GPU ma narzut, ale narzut małego pakietu jest tak samo duży jak duży pakiet, więc jest to duży zysk, gdy wysyłasz jeden duży pakiet, a nie sto mniejszych. I to właśnie jest partia; tworząc jedną dużą paczkę ze wszystkich tych mniejszych.

Batchowanie jest szczególnie przydatne dla duszków ze względu na absurdalnie małą ilość danych na duszka; cztery wierzchołki i cztery współrzędne tex. Narzut związany z małym pakietem jest proporcjonalnie duży.

API-Beast
źródło
1
+1 za wzmiankę o problemie z opóźnieniem; jest to ta sama zasada, która dotyczy również ruchu sieciowego i operacji we / wy dysku - w ogólnym przypadku bardzo niewiele dużych partii przebija wiele małych partii.
Maximus Minimus
9

Wsadowe duszki to metoda przesyłania wielu duszków do GPU za pomocą jednego wywołania losowania.

Żadna z pozostałych odpowiedzi nie wskazuje na prawdziwy punkt robienia tego: minimalizowanie zmian stanu i składanie poleceń przez GPU. Jeśli masz 100 rysowanych przeze mnie ikonek, każda z własną teksturą, sprzęt może przetwarzać tylko jedną duszkę na raz. Dziesiątki, a nawet tysiące rdzeni shaderów nie są w pełni wykorzystywane, a procesor graficzny poświęca zbyt wiele czasu na konfigurowanie swojego stanu renderowania dla przełączników tekstur.

Jeśli umieścisz wszystkie obrazy duszka w atlasie, możesz zminimalizować zmiany stanu potrzebne do narysowania. Sterownik może nawet być w stanie automatycznie łączyć żądania rysowania ikonek w jedną partię, aby sprzęt mógł być w pełni wykorzystany, ale nie jest to gwarantowane ani prawdopodobne.

Jeśli użyjesz atlasu sprite, a następnie utworzysz pojedyncze VBO z wypełnionymi wszystkimi quadami sprite, a następnie wykonasz jedno żądanie losowania z tymi danymi, masz gwarancję, że sprzęt jest w pełni wykorzystywany, a wszystkie twoje sprite są renderowane równolegle.

Wsadowe tworzenie sprite'ów robi właśnie to: umieszczenie jak największej liczby twoich sprite'ów w jednym VBO za pomocą pojedynczego atlasu, który jest przesyłany do GPU za pomocą jednego wywołania losowania, maksymalizując użycie GPU.

Istnieją inne sposoby wykonywania grupowania sprite'ów (takie jak instancje sprzętowe, korzystanie z shaderów geometrii itp.) I inne korzyści z tego, ale ich sedno polega na tym, że grupowanie polega na rysowaniu wielu obiektów na wywołanie losowania.

Sean Middleditch
źródło
-1: Minimalizowanie zmian stanu nie jest „punktem” dozowania. Jest to tylko wymóg wynikający ze struktury OpenGL. (Chodzi o atlasy tekstur, ale nie zostały one poproszone.) Pytanie to dotyczy konkretnie definicji „Platforma i język agnostycznie”.
API-Beast
Więc metoda rysowania wszystkiego w backbufferze najpierw rozwiązuje ten problem, jak? Czy dane nie są nadal przetwarzane pojedynczo na jeden obraz w pamięci, a następnie przekazywane do bufora przedniego? Myślę, że moje zrozumienie musi być trochę błędne.
Bloodyaugust
4
Mr. Beast: nie ma to nic wspólnego z OpenGL, żadną platformą czy językiem. Tak właśnie działa sam sprzęt, na wszystkich platformach i interfejsach graficznych API w dowolnym języku.
Sean Middleditch
6

To nie jest ściśle określony termin techniczny. Batching to w zasadzie każdy system, w którym wykonujesz wiele operacji jako zestaw, a nie indywidualnie, i często dzieje się tak, ponieważ jest to bardziej wydajne. Wzrost wydajności zwykle wynika z możliwości ponownego wykorzystania części lub całości kontekstu wymaganego przez operację.

Tak więc, grupowanie duszków to po prostu każdy system, który pozwala narysować wiele duszków na raz i mam nadzieję, że zyska na tym trochę wydajności. Zwykle zaletą jest to, że cała twoja duszka używa tej samej tekstury, więc możesz narysować wszystkie duszki w partii bez zmiany tekstury, co jest stosunkowo powolną operacją.

Kylotan
źródło