Ich schreibe eine Spiel-Engine neu, die ich geschrieben habe, um so viel wie möglich zu parallelisieren. Ich denke darüber nach, Eigenschaften zu erstellen, auf die von mehreren Threads aus zugegriffen werden kann. Alle verwenden Accessoren, die boost scoped_locks verwenden, um Race-Bedingungen zu vermeiden.
Angenommen, ich habe einen Charakter mit der Basisklasse CharacterBase. Die X / Y / Z-Koordinaten des Charakters werden durch Accessoren mit Sperren mit Gültigkeitsbereich gesteuert. In der Hauptschleife werden 3 Threads ausgeführt, einer zum Verarbeiten der Physik, einer zum Verarbeiten des Renderns und einer zum Verarbeiten von Benutzereingaben usw.
Dies führt dazu, dass scoped_locks grundsätzlich überall vorhanden sind und vom Design explizit benötigt werden, wenn Benutzer die Engine erweitern. Ich habe vor, diese Open Source-Version zu erstellen, daher frage ich mich, ob dieses Design aus technischer Sicht oder aus Sicht des Endbenutzers (für diejenigen, die den Motor erweitern) erhebliche Mängel oder Nachteile aufweist. Vielen Dank!
Antworten:
Sie schlagen vor, jedes einzelne "System" parallel auszuführen. Das Problem dabei ist, dass Sie jeden einzelnen gemeinsam genutzten Status sperren müssen. CLARITY EDIT: Wenn Sie zwei parallele Vorgänge mit denselben Daten ausführen, werden Sperrenkonflikte und Synchronisierungen die Dinge verlangsamen, sodass Sie nicht viele Vorteile aus der Parallelisierung ziehen.
Der Schlüssel zum Multithreading einer Spiel-Engine besteht darin, zu erkennen, dass viele Systeme SIMD-ähnliche Operationen ausführen, bei denen eine einzelne Operation über eine große Anzahl von Spielobjekten ausgeführt wird. Ein Beispiel ist das Hinzufügen der Beschleunigung jedes Objekts zu seiner Geschwindigkeit und das Hinzufügen seiner Geschwindigkeit zu seiner Position. Wenn so etwas passiert, können Sie die Arbeitslast auf mehrere Threads verteilen. Sie werden enorme Leistungssteigerungen feststellen, wenn Sie CPU-intensive Vorgänge wie Pfadfindung oder Kollisionsprüfung parallelisieren.
Dies ist besser, da der Spielstatus nicht gesperrt werden muss und keine Probleme im Zusammenhang mit der Synchronisierung oder dem Rennen auftreten. Tatsächlich muss sich Ihre Hauptschleife überhaupt nicht ändern!
quelle