Frage

Hier stellen sich ein paar Fragen.

Stellen Sie sich vor, ich habe Kunde A, der die folgende Nachricht an den Server senden wird:„BEWEGUNG VORWÄRTS STARTEN“.

Der Server erhält diese Nachricht nicht sofort, da es aufgrund der Latenz zu einer Verzögerung kommt.

Frage 1:ping (oder besser: Zeit für eine Rundreise) ist die Zeit, die der Client benötigt, um eine Nachricht an den Server zu senden und eine Antwort zurück zu erhalten.Bedeutet dies Folgendes, wenn Sie die Zeit ignorieren können, die der Server benötigt, um zu bemerken, dass er eine Nachricht erhalten hat, und mit dem Senden einer Antwort beginnt (diese sollte sehr kurz sein)?

  1. Zeit, die der Client benötigt, um etwas an den Server zu senden = Round-Trip-Time / 2
  2. Zeit, die der Server benötigt, um etwas an den Client zu senden = Round-Trip-Time / 2

Wenn also Client A diese Nachricht sendet, empfängt der Server diese Nachricht vermutlich mit der Umlaufzeit / 2 Millisekunden, nachdem der Client die Nachricht gesendet hat.Das führt mich zur nächsten Frage.

Frage 2:Sollte der Client zuerst das Paket senden und dann die Umlaufzeit / 2 Millisekunden warten, bevor er diesen Befehl tatsächlich clientseitig ausführt (in diesem Fall:vorwärts bewegen), um die Latenz/Verzögerung auszugleichen?

Nun sendet der Server die folgende Nachricht an alle Spieler in der Nähe:„KUNDE A KOMMT JETZT WEITER.“Diese Klienten werden dann dafür sorgen, dass sich der Charakter des Klienten a in Bewegung setzt, was mich zur nächsten Frage führt.

Frage 3:Sollte der Client, der die Nachricht empfängt, dass ein anderer Client umgezogen ist, berücksichtigen, dass diese Nachricht vor 2 Millisekunden vom Server in der Roundtrip-Zeit gesendet wurde?Damit die aktuelle Zeit, die für Bewegungsberechnungen verwendet wird, um die Umlaufzeit / 2 reduziert werden sollte?

Alle diese Methoden würden meiner Meinung nach dafür sorgen, dass die Synchronisierung zwischen Clients verbessert wird, da die Latenz berücksichtigt wird.Ist das die richtige Vorgehensweise?Machen die meisten anderen guten Multiplayer-Spiele das?Irgendwelche Kommentare, Vorschläge, Alternativen oder zufällige, aber verwandte Grüße, die Sie gerne aussprechen würden?Dank im Voraus.

War es hilfreich?

Lösung

Ich denke, dass in den meisten MMOs Ihres Kunden vor allem ohne Interaktion bewegt sich mit dem Server, es sei denn schlechte Verzögerung auftritt. Der Server gibt die Bewegung mit Hilfe der Nachrichten der Client an den Server senden. Wenn also zum Beispiel der Server nacheilt, wird der Client stoppen Feedback vom Server recieving und wieder auf die Position der Server bestimmen, dass Sie an. Deshalb sollten Sie bei schlechter Verzögerung mehr Frames zurückspringen. Auf diese Weise der Server auch die Kontrolle über die Geschwindigkeit haben, so dass Sie nicht speedhacking. Wenn Ihr Kunde mit einer bestimmten Geschwindigkeit bewegt, die über die Geschwindigkeit durch den Server bestimmt ist, würden Sie einfach die zusätzliche Frames springen.

Andere Kunden würden Sie gar nicht zulassen, bewegen, ohne Antwort vom Server innerhalb einer bestimmten Zeit. Dies ist die Zeit Sie würden erleben ‚gefrier liegt‘.

Natürlich gibt es auch Ereignisse, wo der Server einfach die Position durch den Client gesendet nehmen und vertraut ihm blind. Dies sind die Spiele, die im Allgemeinen anfällig für Hacks teleportieren.

Wenn es dort in der Tat auf die Position anderer Spieler kommt, ist eine Verzögerung, die, wenn Sie zwei Computer nehmen zu sehen ist, eine Verbindung zu einem Spiel wie wow und die beiden Zeichen simultaniously bewegen. Sie würden sehen, dass auf beiden Computern die nicht-lokalen Charakter zu bewegen beginnt, nachdem Sie ihn wirklich setzte sich in Bewegung.

Der Kunde in der Regel eine Art von Verzögerung Entschädigung. Also, wenn ein anderer Spieler in einer bestimmten Richtung bewegt und dann stoppt, wird Ihr Kunde noch die Bewegung des Spielers simulieren, bis Sie eine Nachricht vom Server empfangen, dass er die Richtung geändert oder gestoppt bewegen. Deshalb können andere Spieler hin und her springen, wenn der Ping hoch ist. Aus diesem Grund ist auch die Spieler scheinen, um nur / run zu gleiten / zu Fuß entfernt, wenn Sie lagspikes treffen und dann in ihre wirkliche Position zurück, wenn Ihre Kunden Positionen vom Server empfangen.

Natürlich ändert dies von Motor zu Motor, aber es ist eine ziemlich allgemeine aproach.

Edit: Vergessen hinzuzufügen, dass es sehr üblich, dass der Server auch Verzögerungskompensation verwenden. Wenn Sie jemand in einem mmo getroffen, die in einem Bereich von Ihnen sind, kann diese Person nicht in Reichweite sein, von den Servern anzuzeigen. So nimmt der Server die Latenzzeit für beide Ihre Kunden und versucht, bis passen, wenn Sie wirklich in Reichweite von uns waren oder nicht.

Andere Tipps

Dies ist eine alte Frage, aber ich habe vor kurzem einen ähnlichen Code gearbeitet, so vielleicht das jemand helfen.

Ja Latenz ist bei der Berechnung immer nützlich. Aber es ist etwas komplexer als RTT. Umlaufzeit verändert sich ständig ... Ihr Netzwerkcode einen Durchschnitt halten, aber die Abweichung von diesem Durchschnitt groß ist.

Der lokale Client, Remote-Client und Server all vorhersagen, die aktuelle Position unter Verwendung von Algorithmen. Die folgenden Daten sind in der Nähe typisch:

  • Zeit: t
  • Placement: Position (x, y, z) und Orientierung (x, y, z, w)
  • Bewegung: Lineares Bewegungsvektor zu geben Richtung mit der Länge, wie Geschwindigkeit (x, y, z), und Drehbewegungsvektor-Achse mit der Länge, wie Drehzahl (x, y, z)
  • geben

Sie müssen die Algorithmen, die von einem [T, P, M] auf der simtime extrapolieren. Und ich will hier nicht weitergeben.

Wenn der Client eine Änderung der Antrieb des Schiffes registriert bei [T, P, M], das wird nicht bis T + DeltaT auf den Server erhalten. Aber wenn deltaT innerhalb der Toleranz von typischen Netzwerklatenzen ist, kann der Server sagen: „Ja, es bei T passiert ist, ich das akzeptieren.“ Andernfalls könnte es den Client sagen korrigieren will „Nein, das ist außerhalb der Toleranz, kam es zu meiner Zeit T‘“in diesem Fall wird der Kunde all anschließend angetrieben [T, P, M] Änderungen vom Server des korrigierte eine REPLAY wird (dh Sie können eine Warteschlange oder Liste von ihnen halten müssen).

Der nächste Kunde wird es bei T + deltaT + differentdeltaT bekommen. Es kann unmöglich ändern, was es bereits simuliert hat, also wenn es nicht verzögert es Simulation wird das Remote-Schiff springen und Sie werden einen Ruck Rahmen sehen. Deshalb Fern angetrieben Schiffe ihre Simulationen durch eine Zeit durchweg größer als 2 * typicaldeltaT verzögert haben soll. Es sollte eine konstante Verzögerung oder eine Verzögerung, die nach und nach, und in Zeiten schwerer Verzögerung verändert werden Sie Ruck Frames dennoch

siehe

Sie können alle Idioten mit zusätzlichen Glättungs Code glätten, aber tun es nicht, bis Ihr Code ansonsten makellos ist, weil es einfach unmöglich machen, um zu sehen, wo die Probleme sind.

Sie müssen eine gute synchronisierter Zeitreferenz haben. Viele Codes gibt es tut ziemlich schlampig (z RakNet nicht (oder nicht) tut es sehr gut). Hier ist ein guter Tipp: Auf kurze Sicht kann man davon ausgehen, dass jede Uhr mit der gleichen Geschwindigkeit laufen, und Sie müssen herausfinden, was der Offset, also halten Sie ein Fenster der maximalen und minimalen Offset und schließen Sie es, wie Sie lernen; Auf lange Sicht müssen Sie für Kunden, deren Uhren schnell oder langsam sind zu kompensieren laufen, so lassen Sie das Fenster öffnen, wenn Sie sicher wissen, es muss. Sie müssen eine lokale Zeitquelle verwenden, die monoton steigenden und nicht weg von der Prozessorgeschwindigkeit eingegeben (die heute variabel ist).

Nein, nicht die lokale Simulation verzögern, wenn die lokale „Avatar“ bewegt. Es scheint viel zu nicht mehr reagiert. Man könnte es verzögern leicht (bis zu vielleicht 50 ms) zu verbessern Synchronisation zu helfen, aber eine Verzögerung des ganzen Weg, um die RTT würde Ihr Spiel scheint frustrierende unempfänglich machen. Eine Option für die lokale Verzögerung und mit ihm spielen, weil eine kleine konsistente Verzögerung akzeptabel sein kann und die Synchronisation verbessern. Aber es ist nicht notwendig und kann viele Probleme verursachen, so empfehle ich zuletzt, dass Code zu tun. (Wenn Sie versuchen, ein FPS Nahkampf Spiel zu tun, müssen Sie diese und alle anderen Hilfe tun, können Sie erhalten).

Wie für Betrüger Prävention vs. Simulation Ruhe: Erstens sollten die Kunden nicht nur von der letzten bekannten Position extrapolieren, wenn die offiziellen Position ändert. Es sollte eine Anpassung Vektorregister und langsam aus dem alten Pfad zum neuen Pfad für Glätte bewegen (aber wie ich schon sagte oben tun, um diesen Code letzten oder es wird andere Fehler maskiert). Zweitens sollte der Server eine Vielzahl von Verzögerungen tolerieren ... auch auf Maschinen auf dem gleichen Ethernet die Paketverzögerung typischerweise läuft 5ms bis 100 ms oder so ..., dass eine ganze Reihe ist. Natürlich müssen Sie schneidenes weg und sagen: „Wenn Sie sagen, Sie zum Zeitpunkt T bewegt, aber ich habe das Paket bei T + some_large_number dann denke ich, Sie versuchen, die Vergangenheit und liegen mir einzustellen.“ some_large_number sollte nicht viel größer sein als die durchschnittliche RTT Menschen zu halten, ehrlich.

Die Simulationen werden nie fest synchronisiert werden. Sie sollten innerhalb von 400 ms oder so über das Internet bleiben, aber wird sicherlich außerhalb dass in Zeiten der Verzögerung verirren ... bis 30 Sekunden oder mehr, und Sie müssen tolerieren Dinge, die, weil sie nicht selten sind. Da das Internet durch die Lichtgeschwindigkeit in Kupfer begrenzt ist, können Sie immer Einbahn Latenzen erwarten typischerweise im Bereich seinen von mindestens 100 ms Minimum für Ihre Kunden weit, oft 500ms oder mehr.

Deshalb hoch versuche ich empfehlen Sie keine Nahkampf FPS-Spiel über das Internet (einige große Unternehmen versuchen, aber immer haben Probleme) zu machen. Es gibt Tricks, die Sie tun können, wenn Sie Projektile verwenden (indem man sie schnell in einer Simulation und langsam in die andere läuft), so dass, obwohl der Zeitpunkt ausgeschaltet ist, sieht es auf. Auch die Regel FPS-Spiele verwenden, die Hit-Erkennung auf dem Angreifer Simulation basiert ... es falsch anfühlt, wenn der Angreifer weiß, dass er tot war am Ziel und verfehlt, dann, wenn ein Verteidiger weiß, er war aus dem Weg und wird getroffen Sowieso. Sie haben eine oder das andere zu wählen, und psychologisch das ist, wie es gemacht wurde. Melee erfordert ein Maß an Synchronisation, die ehrlich gesagt unmöglich ist, und die meisten Spiele-Firmen nicht MMORPG FPS Nahkampf berühren, sondern verwenden Auto-Targeting (versuchen Mortal Online zu spielen, werden Sie sehen, was ich meine).

Viel Glück.

für Q1:das sieht für mich richtig aus.

F2:Ich habe das in der Vergangenheit so gemacht:Wenn Sie möchten, dass sich die Dinge reaktionsschnell anfühlen, beginnen Sie sofort mit der Ausführung der Aktion in der Simulation des Clients. Der Server simuliert dann in der Spielzeit vorwärts, wenn die Person die Aktion initiiert hat.d.h.Der Client weiß, zu welcher ms-Zeit die Spielsimulation gestartet wurde, sodass der Server sie auch zu diesem Zeitpunkt starten kann (Hinweis:Dies erfolgt immer zeitlich rückwärts vom aktuellen Tick des Servers, daher müssen Sie den Status rechtzeitig zurückspeichern, um dies zu erreichen.

F3:Die Clients müssen nur wirklich wissen, dass sie zum ZeitpunktDann können Client und Server die Weiterleitung mit denselben Informationen simulieren und bleiben im Allgemeinen synchron (außer wenn gleichzeitig Konflikte auftreten).In diesen Fällen muss der Server die Dinge neu synchronisieren, so dass die Fehlertoleranz in der Regel recht gering ist und das Erlebnis weitgehend reibungslos verläuft.

Wenn Ihr Ziel darin besteht, die Wahrnehmung der Latenz zu verbessern, können Sie auch einfach versuchen, dem Kunden zu vertrauen.

Es gibt mehrere Netzwerkmodelle, diese Probleme zu lösen;

Im Netzwerk-Spiel, müssen Sie zwei Dinge synchronisieren, eine Zeit ist, andere Raum ist.

  1. Ein Netzwerk-Spiel-Modell namens Lockstep;

Sie sollten einen Blick auf dem Artikel haben, indem Alter von empire2 Game-Studio geschrieben, die Details in Lockstep-Modell beschreiben.

In diesem Modell, Client- und Server-Run-Spiel Logik Frame für Frame, zum Beispiel verwendet RTS 100ms als Rahmen, Server und Client Rahmen Id synchronisieren, was bedeutet, Zeit zu synchronisieren.

Client bei 50 Rahmen, senden Befehl MoveForward, aber nicht sofort auszuführen, Client-Server anweisen, wird Bewegungsbefehl an Rahmen 51 zu laufen; dann, wenn der Rahmen 51 kommt, Server- und Client-Befehl zur gleichen Zeit ausgeführt werden. so Client- und Server-Logik werden gleich.

In einem solchen Modell, beim Rahmen 50, Client und Server wird Befehl am Rahmen 49 vielleicht ausgegeben laufen, so gibt es alway 100ms oder mehr Verzögerungs in Client Eingangs Feedback.

die Verzögerung zwischen Client und Server enthält nicht nur Netzwerk RTT, enthält aber auch Verzögerungslogikrahmen, der 100 ms ist;

in diesem Modell, Raum zu synchronisieren, müssen Sie Ihre Kundennummer und Server-Code deterministisch machen, so dass sie nur Befehl synchronisieren und FrameID, es gibt keine Bedürfnisse Entitätsstatus zu synchronisieren.

in diesem Modell Eingang Feedback ist groß, so müssen Sie Animationen oder Ton spielen, um die Verzögerung zu helfen, Spieler zu ignorieren.

  1. andere Modelle verwenden Zustand Sync

in diesem Modell, müssen wir auch Zeit synchronisieren, so Client was aktuelle Zeit im Server erraten wird.

, wenn Spielereingabe, bewegen Client sofort, dann Bewegungsbefehl oder Client-Ziel POS-Server mit aktuellen Zeitstempel-Server senden, die von Client geschätzt wird.

, wenn der Server des Client-Befehl erhält, weiß, dass es, wenn der Befehl in der Serverzeit von Client ausgegeben wird, wird es versuchen, den Befehl mit Extrapolation ausgeführt werden.

alle anderen Clients den Befehl, mit seiner Serverzeit erhalten, wird versuchen, die alle anderen Clients den Befehl zu extrapolieren.

Zu diesen Technologien gehören Client-Prediction, Server Liegt Kompensation Server Entity Interpolation.

in diesem Modell, Client-Eingang Feedback ist kurz, aber für einige Impulsbefehle, wie der Verwendung von Geschicklichkeit, müssen wir noch Lockstep-Methode verwenden, mit Animation, Sound und Partikeleffekten Make-up die Eingang Feedback Zeit.

Im Netzwerk-Spiel gibt mindestens zwei Arten Befehl, zunächst wie Bewegung, Befehl für eine bestimmte Zeit, wie ein stetiger Strom läuft, die das Attribut der Kontinuität hat.

die andere wie Geschicklichkeit, mit kalter Zeit verwenden, Befehl Effekt wird in Impulse nehmen, sollen wir sie anders behandeln.

Einige gute Multiplayer-Spiele verwenden einen Mechanismus Spieler problemlos auch bei hohen Umlaufzeiten bewegen, damit durch die Kunden ermöglicht, die Position des Spielers auf den Server zu entscheiden und zu senden. Es gibt Betrug Prüfmechanismen aber Kunde ist dafür kostenlos. Also, wenn die Umlaufzeit wacko geht sehen Sie die Menschen von Ort springen zu platzieren, während Sie sanft bewegen. Auch nehmen einige MMO-Spiele es auf die nächste Stufe, indem Client-Einzelspieler-Inhalte ohne Zustimmung des Servers zu behandeln. Nur Statistiken, Kampfberichte und einige andere Informationen zusammen mit einigen Betrugsprüfungsdaten an den Server gesendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top