Interpolieren zwischen zwei vernetzten Zuständen?

11

Ich habe viele Entitäten auf der Client-Seite, die simuliert werden (ihre Geschwindigkeiten werden pro Position zu ihren Positionen hinzugefügt), und ich lasse sie sich selbst tot rechnen. Sie senden Updates darüber, wo sie zuletzt gesehen wurden und wie sich ihre Geschwindigkeit ändert. Dies funktioniert großartig und andere Spieler sehen diese Arbeit zu finden. Nach einer Weile beginnen diese Spieler jedoch nach einiger Zeit zu desynchronisieren. Dies liegt an der Latenz.

Ich würde gerne wissen, wie ich zwischen Zuständen interpolieren kann, damit sie an der richtigen Position zu sein scheinen. Ich weiß, wo der Spieler zuletzt gesehen wurde und wie schnell er ist, aber wenn er auf den zuletzt gesehenen Zustand interpoliert, bewegt sich der Spieler tatsächlich rückwärts. Ich konnte die Geschwindigkeit für andere Kunden überhaupt nicht verwenden und sie einfach in die richtige Richtung "lerp", aber ich denke, dies würde zu zackigen Bewegungen führen. Was sind die Alternativen?

Vaughan Hilts
quelle

Antworten:

9

Aus diesem Grund werden Sie feststellen, dass Simulationen häufig 1 oder mehr Frames vor dem ausgeführt werden, was tatsächlich zu einem bestimmten Zeitpunkt auf einem bestimmten Client gerendert wird. Mit anderen Worten, was Sie rendern, könnte tatsächlich das vorletzte Bild sein, nicht das letzte Bild.

Durchsuchen Sie diesen Artikel nach allen Instanzen des Wortes "voraus" und ich denke, Sie werden anfangen, das Bild besser zu bekommen, als ich es oben erklärt habe.

Ingenieur
quelle
Okay, meinen Sie damit, ich sollte den Player wirklich so rendern, wie er vor 300 ms war, und in Richtung Zukunft interpolieren? (In einem separaten Zustand, wenn ein neuer Zustand eintrifft; dies würde wechseln)
Vaughan Hilts
@ VaughanHilts Bitte lesen Sie noch einmal den Artikel und die Kommentare. Gaffer ist ein Experte auf diesem Gebiet und erklärt es viel klarer als ich. Die allgemeine Idee ist jedoch, dass Ihr Simulationsmodell voraus ist, während Ihr Rendering etwas dahinter liegt, um den von Ihnen beschriebenen Effekt zu berücksichtigen. Es ist keineswegs der einzige Ort, an dem ich diese beschriebene Technik gesehen habe.
Ingenieur
2

Wenn du sagst:

Diese Spieler beginnen nach einiger Zeit zu desynchronisieren

Ich denke, dass Ihr Problem möglicherweise mehr damit zu tun hat, dass Ihre Uhren aus dem Takt geraten, als mit Latenzproblemen. Wenn es sich um eine Latenz handelt, sollte sie zu Beginn genauso schlecht sein wie in 10 Minuten. Wenn eine Spieluhr etwas schneller als die andere läuft, gibt es einige seltsame Jitter-Artefakte, die mit der Zeit immer schlimmer werden. Ein Client könnte in Zukunft simulieren, wenn die vorhandenen Pakete vom Server ankommen, wird er den Client zurückziehen und dazu führen, dass Entitäten herumspringen. Führen Sie weitere Tests durch, um dies herauszufinden.

Wenn nicht synchronisierte Spieluhren tatsächlich ein Problem darstellen, müssen Sie Ihre Update-Schleife sehr genau untersuchen und sicherstellen, dass jedes Update auf der verstrichenen Spielzeit basiert (entweder fest oder variabel) und dass das Spiel -time wird mit etwas wie der Wanduhr vorgerückt (keine Renderzeit oder andere Variablen). Gaffer hat einige gute Artikel dazu, und es gibt hier eine anständige Frage, die über feste oder variable Zeitschritte spricht . Hoffe das hilft.

John McDonald
quelle
Dies ist nicht der Fall, der Fall ist in der Tat die Tatsache, dass ich zu weit gerechnet habe (eine Verzögerungsspitze oder so etwas - das Paket zum 'Stoppen' wird nicht rechtzeitig empfangen und der Client kann sich nicht rechtzeitig korrigieren. Ich weiß das definitiv der Fall, weil, nachdem der Client gestoppt hat, ich die meisten DEFINTELAY wieder in Position interpolieren kann.
Vaughan Hilts