Praktyczny koszt efektów zamiany


16

Używam XNA do swoich projektów i na tych forach czasami widzę odniesienia do faktu, że zamiana efektu na siatkę ma stosunkowo wysoki koszt, co mnie zaskakuje, ponieważ myślałem, że zamiana efektu jest po prostu przypadkiem skopiowania zastępczego programu do cieniowania do GPU wraz z odpowiednimi parametrami.

Zastanawiałem się, czy ktoś może dokładnie wyjaśnić, co jest kosztowne w tym procesie? I umieścić, jeśli to możliwe, „względnie” w kontekście?

Na przykład powiedz, że chciałem użyć krótkiego modułu cieniującego, aby pomóc w wyborze,

  1. Zmień efekt na każdym obiekcie, obliczając niepowtarzalny kolor, aby go zidentyfikować i dostarczyć do modułu cieniującego.
  2. Narysuj wszystkie obiekty w celu renderowania w pamięci.
  3. Pobierz kolor z celu i użyj go, aby wyszukać wybrany obiekt.

Jaka część całkowitego czasu potrzebnego na ukończenie tego procesu spędziłaby zamieniając shadery? Mój instynkt powiedziałby, że ponowne renderowanie sceny, bez względu na to, jak prosty jest moduł cieniujący, byłoby wolniejsze o rząd wielkości niż jakakolwiek inna część procesu, więc po co martwić się efektami?

Odpowiedzi:


21

Opisany problem nie jest problemem „specjalnym”. Zmiana efektów na GPU nie jest szczególnie powolna. Problem ze zmianami efektów, parametrami efektów (w tym transformacjami), teksturami, różnymi stanami renderowania i po prostu wysyłaniem wielu poleceń rysowania polega na tym, że konieczne jest wysłanie kolejnej partii do GPU .

Partie są powiązane z procesorem, a do użycia jest tylko kilka tysięcy * na ramkę .

To zależy od procesora i innej pracy, którą wykonujesz, ale powiedzmy, że otrzymujesz około 1000 partii na ramkę. Jeśli renderujesz jeden obiekt na partię, możesz narysować około 1000 obiektów na ekranie, zanim napotkasz problemy.

Jeśli nagle dodasz zbieranie i musisz renderować wszystkie obiekty dwa razy, możesz narysować tylko 500 obiektów.

(Więc jeśli masz tylko niewielką liczbę obiektów, nie martw się o to!)

Aby zmniejszyć liczbę używanych partii, musisz w zasadzie „być sprytny”. Prototypową metodą tego jest sprytne połączenie wielu obiektów w jedną partię. W szczególności wyszukaj „ instancja ”. Być może możesz użyć numeru instancji, aby przypisać unikalny kolor każdemu obiektowi w module cieniującym.

Inną techniką, szczególnie odpowiednią do wybierania, jest wyciszenie renderowanych obiektów w oprogramowaniu, aby nie renderować niczego, co nie dotyka wybranego piksela.

Oto cała talia slajdów firmy NVidia zatytułowana „Partia, partia, partia: co to naprawdę znaczy?” (PDF) z ładnymi wykresami i innymi wyjaśnieniami. Wymienia także niektóre techniki zmniejszania liczby partii.


Zgoda! Dziękuję za wyjaśnienie i sugestie. To, co czytam, ma teraz więcej sensu. Dziękuję również za prezentację NVidia, właśnie czytam ją teraz i jest bardzo pomocna.
sebf

1
Zaktualizowany link do dokumentu „Batch, Batch, Batch”: ce.u-sys.org/Veranstaltungen/…
Marton

1
Dzięki Marton, edytowałem nowy link do wpisu :)
Andrew Russell,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.