2012-04-04 5 views
0

Ein Kollege und ich sprechen darüber, wie Szenen in komplexen Spielen dargestellt werden. Er glaubt, dass die Welt rekursiv in der wahrsten objektorientierten Weise gerendert wird, mit den vielen Schauspielern der Welt jeder überschreibt eine virtuelle Funktion wie Actor.Draw() (z. B. Koopa.Draw(), Goomba.Draw()).Szenendiagramme: Rekursion oder Iteration?

Im Gegensatz dazu stellte ich mir vor, dass komplexe Spiele heute würde Iterierte über ihre Szenengraph, virtuelle Funktion Overhead zu vermeiden und mehr Flexibilität für spezielle Iteratoren ermöglichen (zB in der Nähe von zu weit vs. weit zu nahe, bestimmte Skipping Objekte in der Struktur usw.) Und meine Erfahrung mit OpenGL und DirectX hat mir vorgeschlagen, Objekte im Stapel zu zeichnen und einen Stapelkontext durch einen rekursiven Aufruf zu übergeben (dh den Stapel, in den die Draw() - Funktion einer Klasse zeichnen würde)) schien wie ein zusätzlicher Parameter-Overhead-Overhead, der mit Iteration vermieden werden konnte.

Wird heute eine Methode gegenüber einer anderen bevorzugt? Wenn ja warum?

Antwort

1

Aktualisierung Teile eines Szenengraphen können rekursiv ausgeführt werden. Aber Zeichnung es ist in der Regel über einige räumliche Partitionierung Datenstruktur und Geometrie/render-state batcher, um Überziehung zu verhindern (durch Zeichnen von vorne nach hinten) und minimieren Zustand Schalter der Rendering-Pipeline (Batch-up-Daten, zeichnen Aufrufe, die ähnliche Ressourcen verwenden und Zustände darstellen). Normalerweise ist dieser Zeichnungsteil in gewisser Weise iterativ.

Sie müssen berücksichtigen, wie komplex die Szenen sind, ihre Zusammensetzung und wie viele Objekte gezeichnet werden. Für Projekte mit einfacheren Szenen oder wo Sie bestimmte Informationen im Voraus haben, ist die Sequenzierung Ihres Renderings (fast) optimal nicht die tatsächlichen Kosten von Berechnung der Zeichnungssequenz oder der Stapelverarbeitung wert.

Am Ende wäre die "favorisierte" Methode projektspezifisch.