Multiplayer-Synchronisation und Pfadfindung

8

Ich habe eine Point & Click-Schnittstelle auf einem Client, auf dem ein A * auf dem Server ausgeführt wird, um den Pfad zu finden.

Das Spiel wird wie ein RTS gesteuert, aber die Welt ist hartnäckig, so dass die Spieler jederzeit beitreten / gehen können und höchstens 30 Einheiten auf dem Bildschirm angezeigt werden.

Was ist der beste Weg, um die Spielerbewegungen zwischen Server und Client zu synchronisieren, nachdem ich die Pfade berechnet habe?

Muss der Server die Clients bei jedem Animationsschritt / Frame synchronisieren? oder kann es dem Client einfach sagen, dass er für jeden Knoten auf dem Pfad und jeden sich bewegenden Spieler zu Position X, Y gehen soll? Oder ist es am besten, die Animations-Timer sowohl auf dem Client als auch auf dem Server auszuführen und auf diese Weise implizit zu synchronisieren?

Wie würde der typische Datenaustausch für pfadbasierte Bewegungen aussehen?

BEARBEITEN:

Einige von euch haben Lockstep vorgeschlagen, weil ich "RTS" gesagt habe, aber das Spiel ist kein RTS, es hat nur die gleiche Art von Schnittstelle. Der große Unterschied ist, dass ich jederzeit in der Lage sein muss, Spieler dem Spiel beizutreten und es zu verlassen . Tut mir leid, dass ich nicht genauer bin.

Wolkenkopf
quelle

Antworten:

2

Eine Alternative besteht darin, die Pfadfindung auf dem Client durchzuführen, dem die Einheit gehört. Dies hat den Vorteil, dass die Arbeit gleichmäßiger verteilt wird. Ein Nachteil der gesamten Pfadfindung auf dem Server besteht darin, dass der Server alles ausführen muss. Ein Nachteil des Sendens nur von "Verschieben nach X, Y" -Befehlen an Clients besteht darin, dass jeder Client jeden einzelnen Pfad finden muss. Stattdessen teilt jeder Client dem Server bei jedem "Tick" im Sperrschrittzyklus buchstäblich den nächsten Schritt jedes Geräts mit. Der Server stellt sicher, dass sich das Gerät tatsächlich dorthin bewegen kann, und bewegt das Gerät. Da der Client nicht über alle Informationen verfügt (insbesondere darüber, was die Einheiten des anderen Clients tun), wird ein ungültiger Bewegungsbefehl nicht als Fehler behandelt. Dies gibt etwas Bandbreite auf, um mehr Zeit für die Berechnung von Pfaden zu gewinnen.

Server durch Peer ersetzen; Diese Methode funktioniert auch für Peer-to-Peer-Spiele, sofern Sie sicherstellen, dass die Reihenfolge, in der die Bewegungen der Einheiten berücksichtigt werden, auf allen Computern gleich ist.

Blecki
quelle
1

RTS-Spiele verfügen normalerweise über eine Lockstep-Synchronisierung (die Synchronisierung erfolgt in jedem Frame). Wenn Sie dem Client Pfade mitteilen, können gehackte Clients die zusätzlichen Informationen missbrauchen.

Cloudanger
quelle
1

Weder. Das einzige, was Sie senden sollten, sind die Befehle. Beispiel: Diese 20 Einheiten sollten sich zu (X, Y) bewegen und dann jeden Spieler herausfinden lassen, wie sie dorthin gelangen. Der schwierige Teil ist, sicherzustellen, dass alle genau dasselbe tun. Um dies zu erreichen, wird ein Lockstep-Modell verwendet. Die folgenden Links sollten dies ausführlich erläutern. Außerdem sollten Sie nur die wichtigen Teile synchronisieren. Alles, was das Gameplay nicht verändert, sollte nicht synchronisiert werden. Animationen in RTS-Spielen sind normalerweise nur für die visuelle Seite.

Eine andere Sache, RTS-Spiele sind normalerweise nicht Client-Server, sondern P2P. Auf diese Weise kann einer der Spieler nicht schummeln, denn wenn eine Inkonsistenz festgestellt wird, trennen Sie einfach die Verbindung.

Hier ist etwas, das Ihnen beim Einstieg hilft: http://www.gamasutra.com/view/feature/3094/1500_archers_on_a_288_network_.php http://altdevblogaday.com/2011/07/09/synchronous-rts-engines-and- a-story-of-desyncs / http://altdevblogaday.com/2011/07/24/synchronous-rts-engines-2-sync-harder/

Peter Ølsted
quelle
Das Problem ist, dass ich Spieler brauche, die jederzeit beitreten und gehen können. Das Spiel ist kein RTS, es hat nur eine ähnliche Oberfläche.
Wolkenkopf
Wenn Sie zu einem bestimmten Zeitpunkt mehr als 50 volldynamische Objekte haben, müssen Sie möglicherweise die RTS-Mechanik untersuchen. Ist dein Spiel so etwas wie CIV oder LOL?
Peter Ølsted
Es ist eher wie Diablo, Dungeon Siege oder HoN, aber mit Point & Click. Es sollten höchstens ~ 20 Einheiten auf dem Bildschirm angezeigt werden.
Wolkenkopf
1

Sobald der Pfad berechnet ist, verwendet der Server nur diesen Pfad, um das Zeichen zu steuern. Das Vorhandensein eines Pfads macht für dieses Problem keinen Unterschied - Sie senden immer noch dieselben Daten, unabhängig davon, ob es sich um regelmäßige Positionsaktualisierungen handelt oder was auch immer. Normalerweise ist es in Ordnung, reguläre Positionen (auf dem Client interpoliert, um sie zu glätten) und eine separate Nachricht zu senden, wenn das Gerät stoppt.

Kylotan
quelle
Ok, so gehe ich hin.
Wolkenkopf
1

In meinem Spiel (ein Multiplayer-RPG-Spiel) sende ich Teile des Pfades an den Client (für NPC in der Nähe), dh. die 3 nächsten Positionen und die Zeit, zu der der NPC dort sein sollte. Für Spieler sende ich einfach die letzte gültige Position + ihren Zeitstempel, damit ich auf dem Client tot rechnen kann (oder etwas Aufwändigeres, wenn gewünscht).

Dies funktioniert völlig in Ordnung, vor allem, weil es keine Kollisionen zwischen Spielern / NPC gibt (mit einer geringen Verzögerung bemerken Sie nichts wirklich, mit einer Verzögerung von beispielsweise 250 ms bemerken Sie den Unterschied, wenn Sie die beiden Bildschirme (von zwei Spielern) sehen können ) zur gleichen Zeit, aber es ist immer noch nicht wirklich auf "einem Bildschirm" erkennbar).

Also würde ich sagen: Gehen Sie mit Server-Authoring (Validierung von Positionen + Zeitstempeln von Spielern und auch für die KI am Anfang, Sie können später ohne größere Probleme ein ausgefeilteres System für den NPC erstellen) + Client-Vorhersage.

ps. Ich verwende eine Millisekundengenauigkeit, die einwandfrei funktioniert, außer dass ein signiertes int nur etwa 3 Wochen hält, bevor ich den Server neu starten muss.

Möglicherweise möchten Sie auch die Zeitvorhersage überprüfen (dh versuchen, eine möglichst enge Synchronisierung mit dem Server herzustellen).

Valmond
quelle