Ich implementiere einen Spieleserver, der Star Control-ähnlichen Nahkampf unterstützt . Sie haben also Schiffe, die fliegen und schießen, mit supereinfacher Geschwindigkeits- / Beschleunigungs- / Dämpfungsphysik, um Bewegungen anzutreiben.
Ich habe Valve, Gafferon und Gambetta gelesen und den Gambetta-Algorithmus für die Kundenvorhersage implementiert :
Die Client-Vorhersage funktioniert auf dem Player-Schiff, indem die Position des Servers sofort aktualisiert und die vom Server noch nicht verarbeitete Eingabe erneut auf das Player-Schiff angewendet wird.
Leider funktioniert es für mein Spiel nicht gut. Ich glaube, das hat damit zu tun, dass Gambettas Beispiel keine Objekte berücksichtigt, die sich bereits bewegen, oder Befehle, die Schritt für Schritt aktualisiert werden. (mit "Schritt" meine ich Rahmen). In meinem Spiel drückt der Spieler nach oben, um das (sich bereits bewegende) Schiff zu beschleunigen, das sich auf dem Client weiter bewegt, den Befehl an den Server sendet und normalerweise im nächsten Schritt den Weltschnappschuss vom Server empfängt. Ich bekomme eher etwas wie:
Der Player-Befehl wird in Client- Schritt 3 ausgeführt , auf dem Server jedoch nur in Server- Schritt 5 . Wenn der Client im Schritt 6 des Clients den Weltschnappschuss empfängt , ist die Vorhersage weit entfernt, insbesondere bei schnelleren Geschwindigkeiten.
Der Kern des Problems besteht darin, dass der Client den Befehl in Schritt 5 ausführt , der Server ihn jedoch in Schritt 6 ausführt . Ich dachte darüber nach, den Client-Schritt möglicherweise mit dem Befehl zu senden und den Server zurücksetzen zu lassen und den Befehl mit dem Client-Zeitschritt erneut auszuführen. Dies kann jedoch zu einer Reihe anderer Probleme führen - z. B. was mit Befehlen passiert, die seit dem Rollback empfangen wurden, oder wie betrügerische Clients durch Ändern des gesendeten Schritts ausgenutzt werden können.
Beim Lesen und Ansehen von Videos wie diesem von Google wird ein anderer Ansatz erwähnt, bei dem Sie die Position des Spielers schrittweise ändern, um sie in wenigen Schritten an die des Schnappschusses anzupassen.
Meine Fragen:
Können Sie Gambettas Algorithmus mit konstanter Schrittbewegung arbeiten lassen? Oder ist es konzeptionell nicht mit meinem Spiel kompatibel?
Ist eine schrittweise Interpolation über Schritte dann der richtige Weg? Wenn ja, wie interpolieren Sie ein sich bereits bewegendes Objekt von der Client-Position, um es an das anzupassen, was gerade vom Server empfangen wurde?
Können diese Methoden, die schrittweise Interpolation und der Gambetta-Algorithmus zusammenarbeiten, oder schließen sie sich gegenseitig aus?