Wie synchronisiere ich Client und Server, wenn ich Änderungen der Spielergeschwindigkeit sende?

10

Ich implementiere clientseitige Vorhersagen. Bei den meisten Erklärungen wird davon ausgegangen, dass der Client Nachrichten wie " Bewegen Sie meinen Player um 1 Position nach oben " sendet . Was ist, wenn ich Nachrichten wie " Setze die Geschwindigkeit meines Players auf x " sende ?

erklärende Grafik;  Anzeigen gesendeter Nachrichten und berechneter Positionen auf dem Client und Server im Laufe der Zeit

Auf dem Client legt der Player seine eigene Geschwindigkeit (durch clientseitige Vorhersage) fest, bevor der Server dies tut, was dazu führt, dass die beiden nicht mehr synchron sind. Dieses Problem bleibt auch unter Berücksichtigung der durchschnittlichen Latenz bestehen.

Wie kann ich das angehen?

Blu3
quelle

Antworten:

8

Sie sollten redundante Daten senden, was hier bedeutet, dass Sie die Position und die Geschwindigkeit senden. Selbst wenn Sie nicht synchron sind, können Sie die Flugbahn mithilfe einer Interpolationsfunktion korrigieren, da Sie die Position und die Geschwindigkeit haben.

Wenn Sie dann einige Tricks wie verzögerte Animationen, Beschleunigungen usw. verwenden, können Sie die Latenz verbergen.

Bearbeiten: Ich gehe davon aus, dass der Server autorisierend ist.

Thelvyn
quelle
Danke für deine Antwort. Ja, der Server ist autorisierend, aber selbst wenn ich redundante Daten mit meiner Geschwindigkeit sende, könnte der Client seine Fehler korrigieren, aber ich lese oft Dinge wie "Wenn der Client / Server gemeinsam genutzten Code für seine Entitäten verwendet, treten Vorhersagefehler nie wirklich auf", aber In meinem Fall treten sie IMMER leicht auf, was überall zu Stottern führen würde.
Blu3
1
@ user13842 Der Client wird immer nicht mehr synchron sein. Sie sollten die Position und Geschwindigkeit des Clients korrigieren, wie Thelvyn sagte, je nachdem, welcher Server Sie sendet. Auf diese Weise erhalten Sie keine stotternde Bewegung, es sei denn, Ihr Client ist vollständig nicht synchron. Dann müssen Sie die Werte erfassen, da die Korrektur viel zu lange dauern würde.
Dreta
Dies ist der Hauptgrund für die Verwendung einer Interpolationsfunktion. Sie können die Latenz nicht vermeiden, daher müssen Sie die Bewegung reibungslos korrigieren. Der Client und der Server simulieren die Welt, aber der Client muss auf den Server hören und Korrekturen vornehmen. Einige Techniken, die im Source Engine-Netzwerk verwendet werden: developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Thelvyn
es wird auch in diesem Google-Vortrag kurz erwähnt, es sollte die Idee über youtube.com/watch?v=Prkyd5n0P7k#t=18m47s
dreta
Ich habe eine andere Lösung für dieses spezielle Problem gefunden. Ich addiere die Zeit, zu der der Client seine Eingabe mit jedem Paket angewendet hat. Bedeutung # 1 hätte Zeit: 0 und das zweite Mal: ​​100. Jetzt weiß der Server, dass der Client seine Taste zum Zeitpunkt 100 gedrückt hat und nicht vorher.
Blu3