Szenendiagramm in separatem Thread

12

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?

EricP
quelle

Antworten:

4

Haben Sie Johannes Spohrs Dissertation über "Pace" und dessen Renderer gelesen? Es beschreibt einen sogenannten "Submission Engine" * -Parallel-Renderer und kann Ihnen einige Anregungen geben.

Hier ist die Übersichtsseite (auf Deutsch) und hier ist ein direkter Link zum PDF, das auf Englisch ist.

( *: Dieser Link führt auch zu dem Artikel, in dem ich ursprünglich von der Arbeit gehört habe.)

EDIT: Ich hatte das vorher nur überflogen und es mir nur noch einmal angesehen ... und festgestellt, dass es wirklich Details von Szenendiagrammen überstrahlt. Ich glaube, ich wusste nicht, wie orthogonal sein Design war. Entschuldigung, wenn es nicht besonders hilfreich ist.

Neverender
quelle
1
Ein Teil dieses Dokuments ist mir noch aufgefallen: "Idealerweise würde die Anwendung nicht einmal wissen, dass es überhaupt ein Szenendiagramm gibt. Sie sollte nur eine Ansichtskomponente kennen, die sie über Änderungen am Datenmodell informieren muss." Dies inspirierte mich zu einer neuen Denkweise: Ich muss nicht die gesamte Szene dreimal puffern, sondern nur das, was durch die aktuelle Kamera sichtbar ist. Ich kann Culling vom Render-Thread in den Szenen-Graph-Thread verschieben (wenn er auf eine Kamera stößt), und zu einem bestimmten Zeitpunkt kann einer dieser drei Puffer von ihm beschrieben und ein anderer vom Renderer gelesen werden.
EricP
1
Sie können sich auch den Artikel "Kamerazentriertes Engine-Design für Multithread-Rendering" in Game Engine Gems 1 und das dazugehörige "Praktische parallele Rendering mit DirectX 9 und DirectX 10" ansehen
Neverender
1
Sieht aus wie Game Engine Gems 1 ist kostenlos online verfügbar: books.google.com/…
EricP