Derzeit ist der Client in meinem Spiel nichts anderes als ein Renderer. Wenn der Eingabestatus geändert wird, sendet der Client ein Paket an den Server und bewegt den Player so, als würde er die Eingabe verarbeiten, aber der Server hat das letzte Wort über die Position.
Dies funktioniert im Allgemeinen sehr gut, bis auf ein großes Problem: das Herunterfallen von Kanten. Wenn ein Spieler auf eine Kante zugeht, beispielsweise eine Klippe, und kurz vor dem Verlassen der Kante anhält, manchmal eine Sekunde später, wird er von der Kante teleportiert. Dies liegt daran, dass das Paket "Ich habe aufgehört, W zu drücken" gesendet wird, nachdem der Server die Informationen verarbeitet hat.
Hier ist ein Verzögerungsdiagramm, damit Sie verstehen, was ich meine: http://i.imgur.com/Prr8K.png
Ich könnte einfach ein "W Pressed" -Paket pro Frame senden, damit der Server es verarbeiten kann, aber das scheint eine bandbreitenintensive Lösung zu sein.
Jede Hilfe wird geschätzt!
quelle
Ich verstehe Ihre Frage als:
Der Server erhält ein Paket, wenn ich die Weiterleitungstaste drücke, und ein weiteres Paket, wenn ich die Weiterleitungstaste endlich loslasse. Daher beginnt und endet die tatsächliche Bewegung auf dem Server etwa 100 Millisekunden "zu spät" im tatsächlichen Spiel im Vergleich zu dem, was der Spieler auf der Clientseite ausdrückt. Wenn sich der Spieler also 10 Sekunden bewegen möchte, bewegt er sich möglicherweise 10x Sekunden, anstatt
x >= 1
online zu sein.Dies ist eine schlechte Designstrategie, da sie nicht den Willen des Spielers in der Spielwelt zum Ausdruck bringt, wie der Spieler beabsichtigt, was zu einer eher schlechten Benutzererfahrung führt.
Die Lösung, die ich empfehlen würde, besteht darin, ein Paket zu senden (so oft Sie können), das angibt, wie viele Schritte der Spieler in welche Richtung unternommen hat. Der Server aktualisiert dann die Spielwelt mit dem neuen Spielerstandort, wenn er eine Korrektheitsprüfung besteht. So kann sich der Spieler mit großer Präzision bewegen und vermeiden, von hohen Leisten zu fallen.
Die Alternative wäre, sich die Positionen des Spielers in der letzten Sekunde zu merken und die Position im Nachhinein zu dem Zeitpunkt zu korrigieren, zu dem der Knopf losgelassen wurde. Klingt so, als würde es den Gummibandeffekt der alten Tage erzeugen (nur aus einem anderen Grund)
Grundsätzlich müssten Sie also ein Paket senden, von dem die Taste gedrückt wird und zu welcher tatsächlichen Spielzeit die Taste gedrückt wurde, und später, welche Taste losgelassen wurde und zu welcher genauen Zeit.
quelle