Die Physik wird bei Verwendung von Bullet nicht korrekt über das Netzwerk synchronisiert

11

Ich versuche, ein Client / Server-Physiksystem mit Bullet zu implementieren, habe jedoch Probleme, die Synchronisierung durchzuführen.

Ich habe einen benutzerdefinierten Bewegungsstatus implementiert, der die Transformation von meinen Spielobjekten liest und schreibt und lokal funktioniert. Ich habe jedoch zwei verschiedene Ansätze für vernetzte Spiele ausprobiert:

  1. Dynamische Objekte auf dem Client, die sich ebenfalls auf dem Server befinden (z. B. keine zufälligen Trümmer und andere unwichtige Dinge), werden kinematisch dargestellt. Dies funktioniert korrekt, aber die Objekte bewegen sich nicht sehr reibungslos
  2. Objekte sind auf beiden dynamisch, aber nach jeder Nachricht vom Server, dass sich das Objekt bewegt hat, setze ich die Linear- und Winkelgeschwindigkeit auf die Werte vom Server und rufe btRigidBody :: continueToTransform mit der Transformation auf dem Server auf. Ich rufe auch btCollisionObject :: activ (true) auf; um das Objekt zur Aktualisierung zu zwingen.

Meine Absicht mit Methode 2 war es, im Grunde genommen Methode 1 zu machen, aber Bullet zu entführen, um die Vorhersage eines armen Mannes zu machen, anstatt meine eigene zu machen, um Methode 1 zu glätten, aber dies scheint nicht zu funktionieren (aus Gründen, die nicht 100% klar sind Ich trete sogar durch Bullet) und die Objekte landen manchmal an verschiedenen Orten.

Gehe ich in die richtige Richtung? Bullet scheint einen eigenen Interpolationscode zu haben. Kann mir das helfen, Methode 1 besser zu machen? Oder funktioniert mein Code für Methode 2 nicht, weil ich das versehentlich stampfe?

BEARBEITEN: Ein weiteres Problem mit Methode 1, das ich gerade bemerkt habe, ist, dass die Kollisionsantwort bei Kollisionen mit nicht synchronisierten Objekten weit entfernt ist. Kinetische Körper schießen manchmal bis ins Unendliche, da sie nicht zurückgestoßen werden können.

Lucas
quelle
Ein paar Dinge, die Ihnen helfen könnten, eine Antwort zu erhalten: Welche Sprache / Engine verwenden Sie? Um welche Art von Verbindung handelt es sich? Wie schlimm ist das Synchronisationsdefizit im Vergleich zum Ping an den Server?
Fibericon
2
Die zweite Option funktioniert nicht, da Sie die Geschwindigkeiten erst nach einigen Frames auf die Serverwerte einstellen, sodass zwischen jedem Paket einige Frames liegen, in denen sich die Dinge verschieben können. Ich würde empfehlen, alle Beiträge von Gaffer zur Spielphysik zu lesen. Sie sollten wahrscheinlich zuerst "Fix your timestep" lesen, aber hier ist der letzte Artikel, der über vernetzte Physik spricht. Gafferongames.com/game-physics/networked-physics
Roy T.
Ich verwende eine selbst entwickelte Engine in C ++. Ich bin mir jedoch ziemlich sicher, dass das Synchronisationsdefizit nicht so schlimm ist, wahrscheinlich 1 Frame über Ping, wenn ich raten müsste, aber ich mache immer noch hauptsächlich LAN-Tests. Ich werde mir diese Artikel ansehen und ja, Sie haben Recht, dass die Geschwindigkeiten nicht stimmen. Die Dinge sind jedoch weit entfernt, so wie sich die Kiste auf der Karte befindet. Sollte die explizite Einstellung der Transformation nicht dazu führen, dass sich die Sache irgendwann allgemein anpasst? (Auch wenn es noch nicht schön ist, wackelt usw.)
Lucas
Ich habe Gaffers Beitrag gelesen und er war informativ, aber er schien sich hauptsächlich mit Spielerbewegungen zu befassen, woran ich bereits gearbeitet habe. Ich habe herumgelesen und es scheint, dass mein Code für Methode 2 praktisch identisch mit der in der Unreal-Engine verwendeten Methode ist . Sie liefern nicht viele Details, aber ich frage mich, ob die Idee richtig ist, aber meine Verwendung von Bullet ist einfach falsch.
Lucas
Eine interessante Lektüre, die teilweise mit Ihrem Thema zusammenhängt: gamasutra.com/view/feature/3094/… . Es geht um ein RT und nicht um Physik, aber sie kommen an den Punkt, an dem sie eine Simulation auf Server und Clients synchronisieren müssen. Wie machen sie das? Sie führen unabhängige Simulationen sowohl auf dem Client als auch auf dem Server aus, aber der Server sendet Pakete, die sicherstellen, dass die Client-Simulation nicht divergiert und korrigiert wird, falls dies passiert ...
Tom van Green

Antworten:

4

Sie benötigen eine ordnungsgemäße clientseitige Vorhersage .

Sie sollten den Link, den Roy T. Ihnen in seinem Kommentar gegeben hat, wirklich ausführlich lesen . Es beschreibt, was mit Spielereingabe und Charakterphysik zu tun ist, aber das Prinzip für "servergesteuerte Physik" bleibt dasselbe.

Dies ist nicht trivial zu implementieren, aber in wenigen Worten für Spielobjekte, die synchron sein müssen:

  • Führen Sie die Physik sowohl auf dem Server als auch auf dem Client aus.
  • Der Server sendet regelmäßig Updates.
  • Der Client passt seine Physikwelt kontinuierlich und reibungslos an die Serverwerte an.

Also ja, Sie gehen mit Ihrer Methode 2 in die richtige Richtung. Es reicht jedoch nicht aus, nur die Werte zu überschreiben. Sie erhalten Sprünge auf dem Client. Sie müssen lediglich reibungslos und kontinuierlich auf die Serverwerte interpolieren.

Für Ihren eigentlichen Fehler bin ich mit Bullet nicht vertraut, aber Ihnen fehlen wahrscheinlich einige Werte, z. B. Sie haben die linearen und Winkelgeschwindigkeiten eingestellt, aber haben Sie die Beschleunigungen eingestellt?

Laurent Couvidou
quelle
Vielen Dank! Dadurch fühle ich mich besser, wenn ich auf dem richtigen Weg bin. Ich werde jetzt meinen Code mit einem feinen Zahnkamm durchgehen. Vielleicht wird eine Benachrichtigung nicht ausgelöst oder wie Sie sagen, fehlt mir ein Wert, da Methode 2 (ruckartig) funktionieren sollte.
Lucas
3

Was ich persönlich mache, ist, wer auch immer das Spiel hostet, erstellt die Phsyics-Welt und synchronisiert Objekte mit den Kunden. Auch wenn es sich um ein P2P-Netzwerkschema handelt, stütze ich die Physik-Engine immer noch auf einen der Clients des Players.

Andere Physik, die ich benutze und die nur eine Augenweide ist, muss nicht einmal synchronisiert werden.

In einem Prototyp namens "Boilerzerker", den ich vor einiger Zeit erstellt habe, habe ich Physik auf dem Host ausgeführt, und Partikeleffekte (auch unter Verwendung von Physik) wurden nicht über ein Netzwerk synchronisiert, sondern für jeden Client unabhängig, da sie eine Augenweide waren.

tsturzl
quelle
Danke, ja, das ist eine Möglichkeit. Es führt jedoch nicht zu netten Kollisionsreaktionen auf dem Client auf Dinge, die der Client tut, und auch das Eye-Candy-Zeug interagiert nicht immer richtig, da es die Server-Dinge nicht zurückschieben kann (zumindest innerhalb dieses Zeitschritts). Ich denke, dies muss möglich sein, da Motoren wie Unreal und Source dies zu tun scheinen.
Lucas
Eye Candy muss nicht synchronisiert werden, sondern kann pro Kunde berechnet werden. Die Antwort auf dem Client wird auf dem Server berechnet. Die Koordinaten für den Client werden nur berechnet und zurückgesendet. Sie senden keinen Rückruf an den Client, der besagt, dass er kollidiert ist. Das würde wahrscheinlich schrecklich aussehen.
tsturzl
2

Es ist unmöglich, netzsynchrone Physikwelten zu implementieren. Kleiner Unterschied in Schritt N natürlich viel größerer Unterschied in Schritt N + 1 Sie können keine Kräfte oder Impulse anwenden, um die Synchronität aufrechtzuerhalten und realistisch auszusehen.

Lösungen: -

  1. Sie können in Betracht ziehen, nur wenige Objekte wie Charaktere oder Rennwagen zu synchronisieren, insbesondere wenn diese kinematisch sind. Aber der größte Teil der Welt wäre nicht synchron, um realistisch auszusehen.

  2. Sie können eine Physikwelt auf dem Server haben und Objektpositionen und -geschwindigkeiten an Clients senden.

Max
quelle
Sie können versuchen, ein Netzwerkspiel mit Physik zu spielen, um festzustellen, dass die Welten nicht synchron sind. zB Need For Speed ​​World ist kostenlos und verfügt über Multiplayer und grundlegende Physik. (Kisten auf der Straße und zerstörbare Gegenstände)
Max
Ich bin mir nicht sicher, ob ich dir genau folge. Ich bin mir ziemlich sicher, dass dies möglich ist, da viele Spiele es Spielern ermöglichen, Kisten herumzuwerfen (zum Beispiel). Es scheint, als ob Ihre Option 2 meiner Option 2 ähnlich ist, aber ich kann Bullet nicht dazu bringen, die Objekte sauber an ihren Serverpositionen zu fangen. Vielleicht ist das mein Grundproblem?
Lucas
1
Nein. Normalerweise ist es eine Illusion von Synchronität. Wenn Sie Bildschirme vergleichen, werden Sie feststellen, dass beim Abprallen in Boxen Boxen in verschiedene Richtungen fliegen. oder Boxen sind überhaupt keine Physik (nur ed Animationen). Die Anzahl der Boxen ist unterschiedlich. Wenn ich Animation sage, meine ich, dass hinter Bewegungen keine physikalische Animation steckt. Sie machen keine verschiedenen Tricks, damit das Bild etwas synchron aussieht, aber es sind keine synchronen Physikwelten. Sie sollten schauen und vergleichen, wie sie sich in verschiedenen Spielen bewegen.
Max