Ich möchte den Status während des Spiels serialisieren, ihn über das Netzwerk an einen identischen Computer senden (dieselbe CPU, dasselbe Betriebssystem, dieselbe Binärdatei), ihn dort laden und die beiden Spiele zusammen ausführen lassen, wobei genau dieselbe Simulation ohne eines ausgeführt wird von ihnen abdriften und drunter und drüber gehen.
Kurz gesagt: Ich möchte Pop-In- und Pop-Out-Netzwerkunterstützung für mein hochphysikintensives Spiel, bei dem das Senden von Objektkoordinaten alle paar Sekunden unmöglich ist, da Tausende von Objekten und viele Clients vorhanden sind.
Ich habe dies mit Box2D versucht, und das Speichern der Position / Geschwindigkeit / usw. eines Objekts war nicht genug ... es gibt einen internen Status, auf den über keine öffentlichen Methoden zugegriffen werden kann.
Meine derzeitige Problemumgehung besteht darin, JEDEN Client zu zwingen, seinen gesamten Weltzustand zu speichern und ihn von Grund auf neu zu laden, wenn ein neuer Spieler eine Verbindung herstellt. Dies ist jedoch offensichtlich eine schlechte Vorgehensweise, da das Spiel für alle Spieler hängt, wenn eine neue Verbindung hergestellt wird. Es funktioniert jedoch ohne Desynchronisation.
Kennt jemand andere Techniken, die mir helfen können? Oder sollte ich mein Projekt einfach zum Abschied küssen?
Antworten:
Ich hatte das gleiche Problem (Synchronisieren von box2d-Welten für Browser-Clients mit world on node.js Server) und meine Lösung: Box2d-Welten im laufenden Betrieb synchronisieren - unmöglich. Also habe ich die gesamte Physik von Clients abgeschnitten, und jetzt empfangen sie diskrete zeitgestempelte Positionen von Objekten (und einigen Ereignissen) vom Server (auf dem box2d ausgeführt wird) und interpolieren zwischen ihnen. Box2d verwendet Werte, die in vorherigen Schritten generiert wurden, um den nächsten Schritt zu berechnen. Sie müssen also tief unter die Haube gehen, um box2d netzwerkkompatibel zu machen.
quelle
Führen Sie Ihre Simulation auf dem Server aus, senden Sie Clients zeitgestempelte Objektstatusaktualisierungen (deltakomprimiert) mit einer festen Rate, senden Sie andere Spielereignismeldungen, sobald sie auftreten, und lassen Sie Clients die Interpolation / Extrapolation zwischen Netzwerkstatusaktualisierungen durchführen. Sie müssen nicht Updates für alle Objekte im Spiel an alle Clients senden. Simulieren Sie den Kegelstumpf der Player-Kamera (3D) oder die Ansichtsrichtung (2D) auf dem Server und wählen Sie Ihren bevorzugten räumlichen Partitionierungsalgorithmus aus, um zu bestimmen, welche Objekte ein bestimmter Client sehen kann. Senden Sie nur Aktualisierungen für das, was ein Client sehen kann. Dadurch wird die CPU des Servers stärker belastet, das Netzwerkband auf dem Server wird jedoch auf einen vernünftigen Wert reduziert.
quelle