Ich entwickle meine eigene Spiel-Engine zum Spaß (aber nicht zum Profit). Ich habe Rendering in einem Thread und meine Szenendiagramm-Updates (Geschwindigkeit usw.) in einem anderen. Wenn es Zeit zum Rendern ist, fügt der Renderthread die sichtbaren Knoten einem neuen linearen Puffer hinzu und durchläuft sie.
Genauer gesagt ist mein Szenendiagramm dreifach gepuffert. Jeder Knoten in meinem Szenendiagramm verfügt über drei Kopien seiner relativen und absoluten Transformationsmatrizen (4x4). Zu jedem Zeitpunkt wird eine Kopie vom Szenengrafenthread beschrieben, eine Kopie wird vom Renderer gelesen und eine dritte ist vorhanden, sodass der Leser oder Schreiber zur nächsten übergehen kann, ohne auf die andere zu warten. Dies verhindert, dass während des Renderns auf etwas geschrieben wird und ein halbaktuelles Szenendiagramm gerendert wird. Irgendwie habe ich auch eine vierte Kopie jeder Matrix, mit der der Benutzer arbeiten kann, um nicht mit dem Update-Thread in Konflikt zu geraten. Dies scheint gut zu funktionieren, da nicht ständig synchronisiert werden muss.
Dies ist jedoch ein Chaos.
Dies sind meine ultimativen Ziele für das System:
- Rendern und Aktualisieren von Szenendiagrammen bleiben in separaten Threads.
- Minimieren Sie, wie viel diese Threads aufeinander warten müssen.
- Rendern Sie keine Szene, die vom Update-Thread zur Hälfte aktualisiert wurde. Dies macht sich insbesondere dann bemerkbar, wenn sich die Kamera schnell bewegt und manchmal vor oder nach einem Update gerendert wird.
- Reduzierte Speichernutzung. Ich habe viel zu viele Matrizen pro Knoten. Ich denke auch darüber nach, Vektoren für Position / Rotation / Skalierung zu verwenden, da die Gleitkommadrift bei Matrizen erhöht ist.
- Fähigkeit, mit Zehntausenden von Knoten umzugehen. Das gegenwärtige System macht dies ziemlich gut.
Ich hoffe auch, Bullet (die Physik-Engine) und das Networking in Zukunft einbeziehen zu können, über die ich nicht viel nachgedacht habe.
Welche Ansätze gibt es, um ein besseres Szenendiagramm zu erstellen?