Umgang mit zufälligen Bewegungen in Echtzeit mit clientseitiger Vorhersage

10

Ich baue ein Echtzeit-Multiplayer-Spiel, das auf Client und Server dieselbe "Physik" -Schleife ausführt. Ich benutze ein Lenkverhalten, das eine wesentliche zufällige Bewegung ist. Der Client und der Server generieren beim Ausführen der Wander-Algorithmen unterschiedliche Zufallszahlen.

Ich frage mich, wie ich eine natürlich zufällig aussehende Bewegung beibehalten kann, aber eine Konstante verwende, die sicherstellt, dass Client und Server zu demselben Ergebnis kommen.

kevzettler
quelle
4
Das Erzeugen derselben Zufallsfolge aus einer Pseudozufallszahlenfolge ist einfach. Das Schwierige ist, die Verwendung dieser Sequenz zu synchronisieren. Sie müssen Ihre Spiellogik deterministisch machen, nicht in dem Sinne, dass Sie keine zufällige Sequenz verwenden, sondern um die zufällige Sequenz deterministisch zu verwenden. Der einfachste Weg, dies zu erreichen, besteht normalerweise darin, Parallelität in der Spielelogikschleife zu vermeiden. Es ist jedoch möglich, Parallelität zu haben, solange die Threads nicht vom Timing und der Sequenzierung des PRNG abhängen, wenn der PRNG nach einem zufälligen Wert gefragt wird. Hier sei Drache.
Lie Ryan

Antworten:

14

Sie können zufälligen Samen verwenden . Wählen Sie denselben 32-Bit-Wert in Server und Client aus (oder der Server kann ihn beim Start an den Client senden). Verwenden Sie es als Startwert für den Zufallsgenerator. Sie können den tatsächlichen Startwert vom Server an den Client senden, indem Sie den Spielstatus aktualisieren. Wenn Sie es nicht senden möchten, müssen Sie sicherstellen, dass Client und Server von diesem Zufallsgenerator die gleiche Anzahl von Zufallszahlen generieren.

Was Sie wissen sollten, bevor Sie sich entschieden haben, kein Saatgut an den Kunden zu senden:

  • Sie haben Probleme mit dem Ausmerzen von Charakteren auf dem Client (bedeutet, dass Sie keine Charaktere tief im Nebel des Krieges auf dem Client verarbeiten). Wenn Sie eine Zeichenauswahl treffen möchten, senden Sie am besten den gesamten Zeichenstatus (mit dem tatsächlichen Startwert) vom Server an den Client, wenn der Client das Zeichen verarbeiten soll. Der Server muss also entscheiden, wann der Client Zeichen verarbeiten soll und wann nicht. Stellen Sie sicher, dass Sie für jedes Zeichen separate Zufallsgeneratoren verwenden.
  • Das gleiche Problem wird mit AI-Lodges sein.
  • Die Zufallszahl von diesem Zufallsgenerator darf nur bei Aktualisierung mit festem Zeitdelta generiert werden. Wenn Sie vor dem Rendern eine zufällige Ziffer für die AI-Interpolation verwenden möchten, sollten Sie einen separaten Zufallsgenerator verwenden (es gibt kein Rendern auf dem Server, es ist also egal, welchen Startwert Sie verwenden).
  • Wenn Sie unterschiedliche Plattformen für Client und Server verwenden möchten (z. B. C ++ und Java), müssen Sie den plattformübergreifenden Zufallsgenerator implementieren (oder finden). Das ist kein großes Problem, da Zufallsgeneratoren einfach zu implementieren sind.
Kostya Regent
quelle
3

Wenn sowohl der Server als auch der Client sich auf den Startwert einigen, geben die meisten Randomisierungsalgorithmen dieselben Werte aus.

Lince Assassino
quelle