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 ...
- 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.
- A sendet außerdem eine Nachricht an den Server mit der Aufschrift "Ich habe entlang dieses Vektors geschossen".
- 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.
- 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.
- 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
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.
quelle
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.
quelle
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?
quelle
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