Autor Wątek: Wydajność statycznych buforów.  (Przeczytany 804 razy)

Offline Ventor

  • Użytkownik

# Marzec 02, 2008, 20:16:57
Napotkałem dzisiaj na dziwny problem, choć może się okaże, że to całkiem normalne tylko ja żyję w nieświadomości ;)

Do tej pory robiłem tak, że każdy statyczny mesh miał swój VB i IB, oczwiście statyczne, D3DUSAGE_WRITEONLY, D3DPOOL_DEFAULT, bo tak mi było wygodniej. Cały czas byłem przekonany że nie jest to za bardzo wydajne rozwiązanie bo trzeba ciągle ustawiać SetStreamSource i SetIndices, a jak "głosi legenda" są to wywołania kosztowne (tak przynajmniej kiedyś czytałem :P)

Dzisiaj zabrałem się za optymalizację i zrobiłem jeden duży VB i IB (też statyczne), wrzuciłem tam całą statyczną geometrię i co się okazało - na pierwszy rzut oka bez zmian. Szukałem, kombinowałem z 16 i 32 bitowym IB, flagami, optymalizacją pod kątem cache i nic. Zainstalowałem PerfHUD-a i... ewidentnie widać że jest o kilka procent wolniej.

Pytanie brzmi: czy takie optymalizacje nadal się stosuje, czy może obecne sprzęty tak dobrze sobie radzą z przełączaniem VB/IB że nie warto? A może jednak nie powinno być wolniej i gdzieś robię błąd?

//Edit
Dodam jeszcze, że GPU jest dłużej bezczynny w przypadku jednego VB i IB, ale sterownik dłużej się wykonuje. Może problemem jest ustawianie przez sterownik offsetów w buforach, a w przypadku wielu buforów zawsze rysowane są całe i nie ma tego problemu?
« Ostatnia zmiana: Marzec 02, 2008, 21:00:16 wysłana przez Ventor »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Ventor

  • Użytkownik

# Marzec 03, 2008, 16:05:56
Testowałem na trzech różnych komputerach, renderowałem pojedyncze siatki, wielokrotnie w jednym przebiegu tą samą siatkę i duże ilości różnych siatek. Ilość trójkątów od kilkudziesięciu do 2 mln. Zawsze ta sama sytuacja - pojednczy VB/IB jest wolniejszy, różnice zależą od tego co jest renderowane i od sprzętu, a sięgają nawet 25%  :o

Ciekawe jest to, że na szybszym sprzęcie różnice procentowe są większe niż na wolniejszym. Odpowiedziałem sobie tym samym na pytanie - nie warto "optymalizować" i nie zawsze warto wierzyć w to co pisze MS:
Cytat: MSDN
As of DirectX 8, the cost of changing vertex buffer is no longer as expensive as it was with previous versions, but it is still good practice to avoid vertex buffer changes where possible.
Cytat: MSDN
Minimize vertex buffer switches

//Edit
Zapomniałem jeszcze dopisać, że próbowałem też wspólny VB, a IB oddzielny dla każdego mesha - wydajność taka sama jak przy wspólnym VB i IB.
« Ostatnia zmiana: Marzec 03, 2008, 16:47:31 wysłana przez Ventor »