2009-04-17 2 views
5

Also ich versuche, eine einfache Multi-Threaded Game-Engine für das Spiel zu erstellen, das ich schreiben möchte. Bis jetzt hat alles ohne Probleme funktioniert, ich weiß sogar, welche Schritte ich machen muss, um es zu beenden.Wie kann ich meine Weltdaten in einer Multi-Threaded Game Engine synchron halten?

Es gibt nur eine Sache, die ich nicht kenne (naja, technisch kenne ich eine Lösung dafür, aber ich hoffe, es gibt etwas eleganteres und schnelleres): Grundsätzlich habe ich für jeden Teil einen eigenen Thread von meinem Motor - Grafik, Eingang, Physik, Audio, etc.

Der Physik-Thread hat eine komplette Szene Knoten Struktur der Welt, wo es alles simuliert. Jetzt muss ich diese Struktur jedoch mit möglichst geringem Overhead auf meinen Grafik-Thread übertragen. Im Idealfall sollten nur die Teile übertragen werden, die sich seit dem letzten Update geändert haben.

Ich habe Komponenten zum Übertragen dieser Daten vorhanden, nur ein Problem erzeugt es.

Bisher habe ich gedacht zwei verschiedene Ansätze:

  • die gesamte Struktur für jedes Update kopieren - sehr einfach, aber möglicherweise Zeit und Speicher intensife (Ich habe keine Erfahrung mit großen Motoren - würde dies machbar sein?)
  • zu verfolgen, welche Teile der Szene durch Markieren der Szene Knoten mit einigen Flags geändert, und dann nur über die geänderten Teile

Ansatz kopieren man eine große Menge an Speicher kopieren würde, aber ohne viel Verarbeitungsleistung r, Ansatz zwei würde das Gegenteil tun: viel Rechenleistung, weniger Speicher kopiert.

Gibt es eine allgemeine Antwort, welcher Ansatz in einer typischen Spielumgebung schneller wäre?

Antwort

4

Nein, es gibt keine allgemein akzeptierte Antwort, es ist ein aktuelles Forschungsgebiet in der Spieleentwicklung.

Meine 2 Cent ist die herkömmliche Weisheit - welche zu verwenden, hängt wirklich von Ihrem speziellen Anwendungsfall - wenn Ihr Spiel viele Daten hat (dh es ist sehr speicherintensiv, wie die meisten Blockbuster Titel), werden Sie wahrscheinlich wollen nur Änderungen übertragen. Wenn Ihr Spiel nicht speicherintensiv ist (z. B. Arcade-Spiele), können Sie wahrscheinlich das gesamte Objekt kopieren.

Ich würde vorschlagen, beide implementieren und Leistungs-Timer anschließen, um zu sehen, welche besser für Sie funktioniert; Es ist möglich, eine Architektur zu implementieren, die beide Methoden transparent verarbeiten kann.

+0

einige Theorie: Peak-Transfer-Rate von DDR2-1066 RAM ist 8533 MB/s, und ich will mindestens 100 Updates pro Sekunde, daher muss ein Update kleiner als 85 MB sein. Ein Physik-Knoten müsste mindestens 32 Bytes haben (28 für Position und Orientierung und mindestens 4 für eine eindeutige ID), wenn 32-Bit-Eingänge als IDs verwendet werden. Bei 10.000 Objekten würde das 312,5 kB pro Update bedeuten (0,3% des Maximums). Dies beinhaltet jedoch nicht den Overhead für die Knotenhierarchie. Sollte einfach möglich sein. – Mononofu

Verwandte Themen