Opracowuję własny silnik gry dla zabawy (ale nie zysku). Mam renderowanie w jednym wątku, a moje aktualizacje scen (prędkość itp.) W innym. Kiedy nadchodzi czas renderowania, wątek renderujący dodaje widoczne węzły do nowego bufora liniowego i przechodzi przez nie.
Bardziej szczegółowo, mój wykres sceny jest trzykrotnie buforowany. Każdy węzeł na moim wykresie sceny ma trzy kopie swoich względnych i absolutnych macierzy transformacji (4x4). W dowolnym momencie wątek wykresu zapisuje jedną kopię, jedna kopia jest odczytywana przez renderer, a trzecia istnieje, aby czytelnik lub pisarz mógł przejść do następnej bez oczekiwania na drugą. Zapobiega to pisaniu na czymś podczas renderowania i renderowaniu częściowo zaktualizowanego wykresu sceny. W jakiś sposób mam również czwartą kopię każdej matrycy, z którą użytkownik może pracować, aby nie kolidować z wątkiem aktualizacji. Wydaje się, że działa to dobrze, unikając konieczności ciągłej synchronizacji.
Jest to jednak bałagan.
Oto moje ostateczne cele dla systemu:
- Renderowanie i aktualizacja wykresu sceny pozostają w osobnych wątkach.
- Zminimalizuj, ile te wątki muszą na siebie czekać.
- Nie renderuj sceny, która została w połowie zaktualizowana przez wątek aktualizacji. Jest to szczególnie widoczne, jeśli kamera porusza się szybko, a czasami jest renderowana przed aktualizacją lub po niej.
- Zmniejszone zużycie pamięci. Mam o wiele za dużo macierzy na węzeł. Zastanawiam się również nad przejściem do wektorów dla pozycji / obrotu / skali z powodu zwiększonego dryftu zmiennoprzecinkowego za pomocą macierzy.
- Możliwość obsługi dziesiątek tysięcy węzłów. Obecny system robi to dość dobrze.
Mam również nadzieję, że w przyszłości zastosuję Bullet (silnik fizyki) i tworzenie sieci, o których nie zastanawiałem się długo.
Jakie są podejścia do uzyskania lepszego wykresu sceny?
źródło