Manipulacja siatką na GPU vs. CPU

9

Trochę ciekawy - gdzie wykonujesz operacje na siatce, na procesorze lub w module cieniującym? Robiłem wszystko na procesorze, a znajomy zasugerował przeniesienie rzeczy na stronę GPU.

Jeśli robisz takie rzeczy jak animacje kości ... na GPU, jak odzyskasz siatkę? (ponieważ robię wykrywanie kolizji ...)

AnonAnon
źródło

Odpowiedzi:

13

Zdarza się to często na GPU, ale są obie kompromisy i to Ty decydujesz, który będzie dla Ciebie najlepszy.

Wykonanie manipulacji na GPU oznacza, że ​​wystarczy wysłać dane siatki tylko raz, a następnie wystarczy wysłać transformacje macierzy, aby je zdeformować. Jest to świetne, ponieważ znacznie zmniejsza wymaganą przepustowość między CPU-> GPU. Oznacza to również, że możesz przesłać tylko jedną kopię siatki do GPU i zastosować transformacje dla wielu różnych instancji siatki. Jednak trudniej jest mieć kolizje o „dokładności siatki”. Ponieważ transformacje są wykonywane na GPU, nie masz ich dostępnych do przetestowania na CPU.

Robienie manipulacji na CPU oznacza, że ​​masz dostęp do przekształconej siatki. Możesz uzyskać dostęp do wszystkiego, co musisz o tym wiedzieć. Oznacza to jednak, że musisz załadować całą siatkę do GPU w każdej ramce. Oznacza to również, że musisz przesłać przekształconą siatkę dla każdego wystąpienia tej siatki. Podsumowując, tutaj nie ma prawie wyczerpującej listy zalet i wad.

  • Plusy dla GPU

    • Prześlij dane siatki raz
    • Przekształć dla wielu instancji
    • Wystarczy wysłać transformacje macierzowe
    • Procesor graficzny bardzo dobrze radzi sobie z równoległymi tego typu rzeczami
  • Wady dla GPU

    • Przekształcone siatki nie są dostępne do testowania na procesorze
  • Plusy dla procesora

    • Przekształcone siatki są dostępne do testów zderzeniowych i wszystkiego, co potrzebne.
  • Wady dla procesora

    • Konieczne jest przesłanie całej przekształconej siatki do każdej ramki
    • Musisz załadować całą siatkę dla każdego wystąpienia siatki

Istnieją jednak sposoby obejścia wad GPU.

  • Nie kolizje z siatką . Użyj czegoś „wystarczająco blisko”, takiego jak obwiednia dla całej siatki lub miej obwiednie dla każdej kości siatki. Poniższe informacje dotyczą transformacji GPU dla siatki oraz transformacji CPU dla wyrównanych do osi ramek ograniczających reprezentujących siatkę. Możesz uzyskać jeszcze dokładniejsze granice, używając nie-AABB.

kości goblinów

  • Przekształć kopię siatki w CPU, jeśli i tylko wtedy, gdy potrzebne są dokładne kolizje siatki . Po tym, jak kolizja ramki granicznej zwróciła wartość true, przekształć siatkę, aby dopasować ją do transformacji na GPU, a następnie sprawdź kolizje z tą, aby uzyskać dokładniejsze dane kolizji.

Podsumowując, zakładam, że możesz zobaczyć, dlaczego transformacja na GPU jest bardziej powszechna

MichaelHouse
źródło
1
Z ciekawości, czy rzeczywiście jest praktyczne przekształcenie siatek w procesor, biorąc pod uwagę złożoność siatek we współczesnych grach, moc i możliwości wielordzeniowe nowoczesnego procesora oraz inne zadania, które musi wykonać procesor? Czy przesyłanie do GPU jest tak powolne, że ten pomysł nawet nie przyszedłby do skutku?
R4D4,
Zależy to od gry, ale zazwyczaj nie jest praktyczna w przypadku gier o umiarkowanym stopniu złożoności. Gdy istnieje tak łatwy wybór wykonywania transformacji na GPU, trudno znaleźć powód uzasadniający dodatkowe wymagania dotyczące zasobów związane z przeprowadzaniem transformacji na procesorze. Problem polega bardziej na wysyłaniu przekształconej siatki do GPU co każdą klatkę, która szybko staje się droga. Jak to często bywa w przypadku oprogramowania, programista decyduje o złożoności i wydajności.
MichaelHouse