Das Szenendiagramm enthält Spielknoten, die Spielobjekte darstellen. Auf den ersten Blick mag es praktisch erscheinen, Scene Graph als physischen Container für Spielobjekte zu verwenden, anstatt beispielsweise std :: vector <>.
Meine Frage ist, ist es praktisch, Scene Graph zu verwenden, um die Spielobjekte zu enthalten , oder sollte es nur verwendet werden, um Verknüpfungen zwischen Szenenobjekten und Knoten zu definieren, während die Objekte in einem separaten Container wie std :: vector <> gespeichert bleiben?
architecture
scene-graph
Bunkai.Satori
quelle
quelle
Antworten:
Die Entscheidung, welche Art von Szenenverwaltung verwendet werden soll, hängt sehr stark von der Art der Logik ab, die Sie ausführen möchten. Betrachten Sie die verschiedenen Konsumenten Ihrer Szene:
Verbraucher rendern
Der Renderer möchte wahrscheinlich nur wissen, was für den Benutzer zu einem bestimmten Zeitpunkt aktuell sichtbar ist. Es möchte eine begrenzte Volumenhierarchie für schnelles Keulen ( BVH-Wiki-Artikel) , damit herausgefunden werden kann, dass ein Stuhl in einem Boot nicht gezeichnet werden muss, da die Grenzen des Bootes außerhalb des Sichtstumpfs liegen. Dies könnte in einen Octree eingebettet sein .
Es könnte auch eine Idee sein wollen, dass sich der Stuhl auf dem Rücken im Boot befindet und dass das Boot auf einigen Wellen auf und ab rollt, wenn es endlich in Sicht kommt. Auf diese Weise können Sie die endgültigen Weltkoordinaten der Eckpunkte des Stuhls ermitteln und die Stuhl- und Bootstransformationen verketten und damit fertig werden (dies erleichtert auch Ihre Arbeit als Programmierer).
Eine weitere Sichtweise auf dieses Problem besteht darin, dass der Renderer wahrscheinlich eine gute Karte ausführt und letztendlich nur einen Stapel Dreiecke sortieren möchte, um Textur-, Shader-, Material-, Beleuchtungs- und Transformationszustandsänderungen zu minimieren. Letzteres wird Ihnen wahrscheinlich mehr helfen als ein BVH, was die Leistung betrifft.
Game Logic Consumer
Die Spielelogik möchte wahrscheinlich nur eine flache Liste von Dingen, die von einem Nachrichtensystem miteinander kommunizieren können, daher ist ein std :: vector wahrscheinlich in Ordnung.
Das Spiel möchte möglicherweise auch einen Weg finden, um zu verfolgen, wer was am nächsten ist. In diesem Fall kann daher eine Art [nächster Nachbar] [3] hilfreich sein. Dies kann auch von einem BVH bereitgestellt werden, aber das Hoch- und Runterfahren des Diagramms kann ärgerlich sein.
Das Spiel möchte vielleicht sogar nur wissen, dass sich bei Bewegung von A auch Punkt B von A bewegen sollte. In diesem Fall kehren wir zu einer Art Transformationshierarchie zurück.
Physik-Verbraucher
Ihre Spielphysik möchte möglicherweise eine [spezielle Darstellung] [4] von Innenräumen für eine sehr schnelle Kollisionserkennung. Alternativ kann eine Art Octree oder [räumliches Hashing] [5] verwendet werden, um effizient Dinge zu finden, die kollidieren könnten.
Keine der oben genannten Physikdatenstrukturen sieht wirklich wie ein "Szenendiagramm" im Java3D-Sinne aus.
Audio-Verbraucher
Eine Audio-Engine möchte nur Geometrie, möglicherweise einen potenziell sichtbaren (hörbaren) Satz oder eine Art Begrenzungsvolumenhierarchie, um die Schalldämpfung und -ausbreitung zu berechnen. Auch dies ist keine normale Art von Szenendiagramm, obwohl es sich möglicherweise um ein Geometriediagramm in Ihrer Szene handelt.
Letztendlich ... ... hängt es wirklich nur von den genauen Anforderungen Ihrer Anwendung ab. Ich würde vorschlagen, zunächst eine flache Liste zu verwenden und zu sehen, wo Ihre Probleme auftreten. Sie können sogar eine flache Liste mit einer Transformationshierarchie ausprobieren, da dies möglicherweise die einzige Art von Szenegraph ist, die aus anderen Gründen als der Effizienz nützlich ist.
Viel Glück!
quelle
Es gibt einen guten Grund, das Szenendiagramm nicht als Container für Spielobjekte zu verwenden, und das ist instanziierend. Wenn Sie einige Ressourcen wiederverwenden möchten, ist es viel sinnvoller, nur mehrmals auf die Ressource aus Ihrem Szenendiagramm zu verweisen, als mehrere tatsächliche Kopien zu haben.
quelle
Das Trennen Ihres Objektmodells und des Ansichtsmodells (Ihres Szenegraphen) ist normalerweise eine gute Idee.
Siehe diesen Artikel zu diesem Thema.
Dies ermöglicht unter anderem die Verwendung von Objektpools. Was für eine effiziente Speicherverwaltung unerlässlich sein könnte.
quelle