Verzögerungskompensation bei vernetzten 2D-Spielen

31

Ich möchte ein 2D-Spiel erstellen, bei dem es sich im Grunde um ein physikgetriebenes Sandbox- / Aktivitätsspiel handelt. Es gibt jedoch etwas, das ich wirklich nicht verstehe. Aus Forschungsergebnissen geht hervor, dass Updates vom Server nur etwa alle 100 ms durchgeführt werden sollten. Ich kann sehen, wie dies für einen Spieler funktioniert, da er nur gleichzeitig die Physik simulieren und durch Interpolation eine Verzögerungskompensation durchführen kann.

Was ich nicht verstehe, ist, wie dies für Updates von anderen Spielern funktioniert. Wenn Kunden nur alle 100 ms über Spielerpositionen informiert werden, sehe ich nicht, wie das funktioniert, da in 100 ms viel passieren kann. Der Spieler hätte in dieser Zeit zweimal die Richtung wechseln können. Ich habe mich gefragt, ob jemand einen Einblick in dieses Thema haben würde.

Grundsätzlich, wie funktioniert das fürs Filmen und so?

Vielen Dank

jmasterx
quelle

Antworten:

58

Zusammenfassung für diejenigen, die keine langen Antworten mögen ...

Es ist möglich, aber es ist unmöglich, eine perfekte Mehrspieler-Physik zu erstellen, wenn es eine Latenz gibt. Warum sich die Latenz auf die Physik auswirkt, wird erklärt. Anschließend werden Tipps zur Verringerung der Auswirkung der Latenz auf Ihre Physiksimulation angeboten.


Das Erstellen eines Mehrspieler-Physikspiels kann mit Gefahren behaftet sein. Es ist unmöglich, ein "perfektes" Online-Mehrspieler-Physikerlebnis zu schaffen. Es gibt Dinge, die Sie tun können, um es besser zu machen, aber es gibt keine Möglichkeit, die Physik unter der Annahme einer Latenz zu perfektionieren.

Das Problem ist, dass die Physik schnell und reaktionsschnell sein muss, um realistisch zu sein, aber gleichzeitig auf der Grundlage der kombinierten Aktionen ALLER Faktoren berechnet werden muss - dh der kombinierten Aktionen aller Spieler. Und wenn es eine Latenz gibt, kann dies nicht in Echtzeit durchgeführt werden.

Es liegt an Ihnen als Entwickler, zu entscheiden, ob Sie die verschiedenen Faktoren unter Kontrolle halten können, und zu verstehen, dass sich die Erfahrung des Spielers verschlechtert, wenn die Latenz zu hoch wird. Wenn Sie damit leben können (und Ihre Spieler können es), dann versuchen Sie es. Am Ende dieses Beitrags finden Sie einige Hinweise, wie Sie den reibungslosen Ablauf gewährleisten können.

Ein Beispiel, um zu zeigen, wie Dinge durcheinander gebracht werden können

Stellen Sie sich ein Spiel vor, in dem zwei Spieler (Clients) mit einem Server verbunden sind. Es dauert 100 Millisekunden (1/10 Sekunde), bis eine Nachricht vom Client zum Server über das Internet gesendet wird. Wenn ein Spieler etwas tut, wird eine Nachricht an den Server gesendet, die besagt, was er getan hat. Der Server sendet die Nachricht dann an die anderen Spieler, damit sie alle wissen, was der amtierende Spieler getan hat.

Erstellen Sie nun ein Szenario, in dem zwei Spieler eine Kiste auf dem Boden haben, bei der es sich um ein Physikobjekt handelt. Spieler A trifft es auf einer Seite und wirft es in eine Richtung. Gleichzeitig schlägt Spieler B auf eine andere Seite und sendet sie in eine andere Richtung.

Schauen wir uns verschiedene Möglichkeiten an, um damit umzugehen, und wie die Ergebnisse aussehen würden ...

Was ist, wenn die Physik nur auf dem Server berechnet wird?

Angenommen, wir haben die Physik nur auf dem Server berechnet. Spieler A sendet die Nachricht "Ich habe Kiste auf diese Weise getroffen" an den Server. Eine Zehntelsekunde später erhält der Server die Nachricht. Spieler B sendet die Nachricht "Ich habe die Kiste andersherum getroffen". Der Server berechnet die Änderung der Physik aus der Kombination der beiden Aktionen und sendet eine Nachricht an beide Spieler zurück, in der er sagt: "OK, es bewegt sich so." Die perfekte Physik basiert auf den Aktionen beider Spieler.

Das Problem ist jedoch, dass es 2/10-Sekunden dauern wird, bis einer der Spieler die Kiste reagieren sieht. Die Nachrichten von beiden Spielern benötigen eine Zehntelsekunde, um den Server zu erreichen, und eine weitere Zehntelsekunde, damit die Server-Berechnungsergebnisse für beide Spieler gesendet werden.

Fazit: Nachlässiges Gameplay.

Was ist, wenn die Physik nur auf dem Client berechnet wird?

Angenommen, wir haben die Physik nur für den Kunden berechnet. Schauen wir es uns aus Sicht von Spieler A an. Spieler A trifft Kiste und es beginnt sofort ihre Richtung. Es wird auch eine Nachricht an den Server gesendet, die besagt, was Spieler A getan hat.

Zur gleichen Zeit hat B ihren Treffer gemacht und gesehen, wie die Kiste in ihre Richtung ging, und dem Server eine Nachricht gesendet, was sie getan haben.

Eine Zehntelsekunde später kommt eine Nachricht vom Server zu den Clients. A wird gesagt, was B getan hat, und B wird gesagt, was A getan hat. Das Problem ist, dass beide Klienten sagen: "Nun, Spieler X hat diesen Treffer an dieser Stelle möglicherweise ausgeführt, aber an dieser Stelle befindet sich keine Kiste mehr. Ihr Treffer hat also nichts bewirkt."

Fazit ist, dass zwei Spiele nicht synchron sind und die Spieler keine gemeinsame Erfahrung haben. Was bringt der Mehrspielermodus, wenn beide unterschiedliche Dinge sehen?

Was ist, wenn die Physik sowohl auf dem Client als auch auf dem Server berechnet wird?

In diesem Fall wird die Physik auf dem Client berechnet, sodass die Spieler eine sofortige Reaktion ohne Verzögerung sehen. Sie wird jedoch auch auf dem Server berechnet, sodass sie für alle Spieler "korrekt" ist.

Beide Spieler schlagen die Kiste in ihre jeweilige Richtung und jeder sieht, dass sich die Kiste nur aufgrund ihres Treffers bewegt. Aber dann, eine Zehntelsekunde später, kommt der Server zurück und sagt: "Nun, eigentlich liegen Sie beide falsch. Die Kiste ist in diese Richtung gegangen." Plötzlich sehen beide Spieler, wie die Kiste die Richtung drastisch ändert und an einen neuen Ort wechselt.

Fazit ist, ein Patzer.

Fazit

Grundsätzlich gibt es keine Möglichkeit, ein perfektes Physikspiel mit mehreren Spielern zu erstellen, wenn Latenzzeiten bestehen. Sie können ein ziemlich gutes Spiel machen, aber Sie werden immer das Risiko einer übermäßigen Latenz haben, was für einige Spieler eine schlechte Erfahrung schafft. Es gibt jedoch Dinge, die Sie tun können, um Ihr Spielerlebnis zu verbessern.

Dinge, die Sie tun können, um ein Multiplayer-Spiel zum Laufen zu bringen

Verwenden Sie einfache Kollisionsvolumina. Machen Sie sich nicht die Mühe, jedes Detail einer Form mit der Physik zu modellieren, wenn dies mit einer einfachen Würfelform möglich ist. Ein Spikey Ball muss nicht als Spikey Ball für die Physik modelliert werden. Modelliere es stattdessen einfach als Kugel.

Erstellen Sie kleine, nicht aufeinander bezogene Objekte, die nur für den Kunden bestimmt sind. Ein Beispiel könnten Glasscherben von einem zerbrochenen Fenster sein. Sie können jeden Client für sich simulieren lassen, und es spielt keine Rolle, ob sie unterschiedlich sind.

Machen Sie Objekte zu Physikobjekten, wenn es sich um Physikobjekte handeln muss, um die Anzahl der aktiven Physikobjekte gering zu halten.

Führe dein Spiel in Zeitlupe aus, wenn du Mehrspieler-Physik machst. Denken Sie vielleicht an "Bullet Time". Zeitlupenspiele gleichen die Latenz aus und ermöglichen es mehreren Spielern, gemeinsam mit der Physik zu interagieren.

Ermöglichen Sie den Spielern, eine bestimmte Situation zusammenzustellen, und simulieren Sie dann auf einen bestimmten Zeitpunkt die Physik für beide Spieler und beobachten Sie beide das Ergebnis ihrer kombinierten Aktionen. Die Spieler dürfen die Sequenz nicht stören, bis sie abgeschlossen ist.

Trenne die Phsyics der Spieler, damit sie sich nicht gegenseitig stören können. Dies ist ideal für ein Spiel wie Bowling oder Billard, bei dem jeweils nur ein Spieler die Kontrolle hat oder jeder Spieler einen eigenen "Sandkasten" (wie eine Bowlingbahn) hat.

Wenn Sie sie nicht schlagen können, schließen Sie sich ihnen an und machen Sie Physikverzögerung zu einem Teil Ihres Spiels. Stellen Sie sich eine Geschichte vor, in der Sie sich in einem unangenehmen Universum befinden, in dem die Gesetze der Physik gebrochen sind oder so :)

Anhang: Wie Shooter damit umgehen

Schießspiele bewältigen dies, indem sie keine übermäßig komplexe Physik betreiben. Sie verwenden Client-Nebeneffekte, damit die Spieler die Dinge schnell sehen, aber dann macht der Server den letzten Aufruf darüber, was passiert ist.

Stellen Sie sich ein Szenario vor, in dem Spieler A auf Spieler B schießt. Ihr typisches Shooter-Spiel macht so etwas ...

  1. A berechnet lokal, ob sie B treffen, und wenn es so aussieht, als ob es einen Treffer gibt, spielt es einen "Treffer" -Effekt wie einen Blutstoß. Dies erfolgt clientseitig, so dass der Spieler sofort eine Reaktion auf seine Aktion sieht. Wenn Sie dies nicht tun, fühlt sich das Spiel verzögert an.
  2. A sendet außerdem eine Nachricht an den Server mit der Aufschrift "Ich habe entlang dieses Vektors geschossen".
  3. Wenn der Server die Nachricht erhält, prüft er, wo sich die Spieler befinden, und entscheidet, ob der Schussvektor von A auf B trifft.
  4. Wenn der Server A Treffer B entscheidet, entscheidet er, dass B Treffer ist, und sendet eine Nachricht an BEIDE Clients, in der angegeben wird, was passiert ist.
  5. Wenn der Server entscheidet, dass A NICHT B getroffen hat, ist B in Ordnung und A "verfehlt". Es sieht vielleicht so aus, als hätten sie getroffen ("Ich habe den Blutstoß gesehen!"), Aber es sind die Server, die sie verpasst haben.

Also, wie konnte A Miss B, wenn es so aussah, als würden sie sie treffen? Weil B möglicherweise umgezogen ist, aber A es noch nicht gesehen hat, weil der Server noch keine Nachricht "B hierher gezogen" an den Client gesendet hat.

Valve hat eine gute Beschreibung auf ihrer Seite darüber. Siehe http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

Tim Holt
quelle
2
Das stimmt auf einem Server mit einer guten Verbindung. Es gibt viele Fälle, in denen die Physik in Multiplayer-Spielen versagt, und ich bin sicher, dass Garrys Mod-Spiele viele schlechte physikalische Erfahrungen aufweisen. Wenn es jedoch zu Verzögerungen kommt, treten die von mir beschriebenen Probleme auf. Man kann nicht umgehen, dass die Physik sehr schnell berechnet werden muss, um reibungslos zu funktionieren. Und wenn Sie Latenz haben, wird es eine Verzögerung geben. Verzögerung bedeutet Verzögerung.
Tim Holt
1
Vielleicht möchten Sie meinen Beitrag noch einmal lesen. Abgesehen von einigen Meinungen am Frontend beschreibe ich genau, was in einer Physiksimulation mit mehreren Spielern passiert - einschließlich der Mod-Spielsitzungen Ihres Garrys. Sie können die Fakten nicht umgehen.
Tim Holt
2
Ok, ich habe meine Gegenstimme in eine Gegenstimme geändert. Aber Sie malen ein wirklich negatives Bild für Multiplayer-Spiele mit Physik, wenn es wirklich vorher gemacht wurde und relativ störungsfrei ist.
AttackingHobo
7
@ AttackingHobo: "Glitch Free" ist relativ. Nachdem ich an einem Spiel mit guter Netzwerkvorhersage gearbeitet habe, sehe ich jetzt Störungen, die ich vorher nicht hatte. Sie beeinflussen die Mechanik selten wesentlich, sind aber vorhanden. Der springende Punkt bei der Vorhersage ist, dass eine kleine Ungenauigkeit in Echtzeit besser ist als eine verzögerte Genauigkeit. Das ändert nichts an der Tatsache, dass Sie immer ungenau sind.
1
+1 für "Stellen Sie sich eine Geschichte vor, die davon handelt, dass Sie sich in einem trüben Universum befinden, in dem die Gesetze der Physik gebrochen sind oder so etwas".
Patryk Czachurski
13

Ich habe eine Reihe von Artikeln zum Thema hier geschrieben: http://www.gabrielgambetta.com/fpm1.html

Die ersten drei Artikel behandeln eine Einführung in das Thema, die clientseitige Vorhersage, die Serverabstimmung und die Entitätsinterpolation (dies ist der Teil, der Ihre spezifische Frage beantwortet). Der 4. Artikel (in Kürze) befasst sich mit "Shooting Stuff" :)

Tim Holts Antwort ist so ziemlich alles. Meine Artikel enthalten einige Diagramme, die Ihnen vielleicht helfen zu verstehen, was los ist, aber Tim und ich sagen im Grunde dasselbe.

ggambett
quelle
Gutes Zeug ggambett!
Tim Holt
2
So viele Spieler verstehen nicht, wie dieses Zeug funktioniert, aber es ist so wichtig, das Ewige zu verstehen: "WTF WARUM HABE ICH FEHLT?" Frage.
Tim Holt
Oder "Warum ist mein Charakter mit einem riesigen Gummiband an diese Säule gebunden?" auf eine
unterbrochene
Valves Wiki hat eine Beschreibung, die sich auch mit diesen Themen befasst. Die Seite befindet sich unter developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Tim Holt,
1
Ich liebe die Live Demo. Was für eine großartige Möglichkeit, sich vorzustellen, was gerade passiert.
Richard Marskell - Drackir
2

Es ist nicht unvernünftig, eine vollständige Vorhersage für die Reaktionsfähigkeit Ihres eigenen Charakters zu treffen und andere Charaktere aus Gründen der Konsistenz um 100 ms zurückzubleiben. Wenn dies schlecht aussieht, sollten Sie erwägen, Ihren eigenen Charakter leicht zu verzögern, um ihn synchron zu halten. In beiden Fällen benötigen Sie noch Korrekturmechanismen, um falsche Vorhersagen im Falle von Verzögerungsspitzen auszugleichen, und dieses System wird Situationen wie die von Ihnen beschriebene behandeln. Es spielt keine Rolle, ob die Latenz 100 ms oder 1 ms beträgt - Ihr Client ist in gewisser Weise immer "spät" und muss daher immer so handeln, als ob er mit alten Daten umgeht, und kosmetische Effekte wie Interpolation anwenden, damit sie vernünftig aussehen.

Kylotan
quelle
0

Am Ende geht es darum, mit den verfügbaren Netzwerkressourcen auszukommen. Idealerweise würden wir in einer Welt ohne Latenz leben und alles kann perfekt synchronisiert werden. Realistisch gesehen aktualisieren Sie die Clients alle 100, 200, 300 ms, und auf dem Client muss eine Logik vorhanden sein, damit das, was passiert ist, reibungslos aussieht. Die "Glätte" ist sehr wichtig, am Ende muss sich das Spiel einfach glatt anfühlen, auch wenn im Hintergrund eine chaotische Synchronisation zwischen Client und Server stattfindet.

Ein guter Beitrag und eine bessere Antwort sind zu finden:

Wie schreibe ich ein Netzwerkspiel?

DeusAduro
quelle
0

Das Problem ist nicht wirklich die Latenz. Es kann gut kompensiert und vorhergesagt werden, um etwaige Probleme zu verbergen. Paketverlust ist ebenfalls kein Problem - das Netzwerksystem sollte robust und für Paketverlust tolerierbar sein. Das Problem sind jedoch die Verzögerungsspitzen und die unvorhersehbare Latenz. Pakete, die nicht synchron ankommen, einige von ihnen werden nur aufgrund von Latenzschwankungen verworfen, können aufgrund von Latenzschwankungen nicht vorhergesagt und interpoliert werden usw.


quelle