Dieses Problem zwischen Verzögerung und Reaktionsfähigkeit tritt bei praktisch allen Motion Controllern auf, egal ob es sich um die Hydra, die Wii-Fernbedienung, den Kinect oder den PlayStation Move handelt.
Das Problem ist folgendes:
Wenn ein Eingabestream eingeht, entscheiden Sie Frame für Frame, ob Sie den Eingabedaten vertrauen möchten oder nicht. ob sich die Trends, die Sie jetzt sehen, in den Daten fortgesetzt haben, die Sie in einem Dutzend Millisekunden erhalten. Wenn sich dieser Frame plötzlich nach rechts verschiebt, wissen Sie nicht, ob es sich um echte Eingabedaten handelt (und Sie sollten darauf reagieren) oder ob es sich lediglich um Jitter handelt (und Sie sollten ihn daher ignorieren). Unabhängig davon, was Sie auswählen, wenn Sie später feststellen, dass Sie sich geirrt haben, haben Sie entweder dem Eingabe-Jitter erlaubt, es in Ihr Spiel zu schaffen (im ersten Fall), oder Sie haben eine Verzögerung in Ihr Spiel eingeführt (im letzteren Fall).
Dafür gibt es keine gute Lösung. Eine "richtige" Lösung, um festzustellen, ob die Eingabe real oder jitter ist, erfordert das Wissen darüber, was der Eingabestream in Zukunft tun wird und was er in der Vergangenheit getan hat. Wir können das in Spielen aus offensichtlichen Gründen nicht tun. Nein, es gibt keine Möglichkeit, Rotationsdaten zu filtern, um Jitter zu entfernen, ohne an Präzision zu verlieren, im Kontext eines Spiels, das mit Eingabedaten in Echtzeit arbeitet.
Ich habe gesehen, dass ein großer Hersteller den Entwicklern empfohlen hat, dieses Problem zu lösen, indem die Spieler beim Drehen des Steuerelements eine Taste gedrückt halten, damit das Spiel an diesem Punkt seinen Anti-Jitter-Code ausschalten kann, sodass es nicht verzögert wird. (Ich empfehle dies nicht, aber es ist ein Ansatz).
Ich habe einige Middleware-Bibliotheken für Bewegungseingaben gesehen, die dieses Problem lösen, indem sie eine künstliche Verzögerung in der Eingabe einführen. Es gibt einen Viertelsekundenpuffer, in den die Eingabedaten eingehen, und Ihr Spiel hört erst eine Viertelsekunde später von der Eingabe. Damit die Bibliothek den Jitter für Sie ausgleichen kann, indem Sie wissen, was aus Sicht des Spiels sowohl vor als auch nach der "Gegenwart" passiert. Das funktioniert großartig, abgesehen von einer Viertelsekunde Verzögerung für alles. Aber es ist eine Möglichkeit, das Problem zu lösen, und es kann eine großartige Arbeit leisten, eine Bewegung mit entferntem Jitter auf Kosten einer konstanten Verzögerung genau darzustellen.
Aber ohne so extrem zu werden, gibt es noch einige Dinge, die wir tun können, um das Verhalten erheblich zu verbessern, obwohl wir wissen, dass es immer "Worst-Case-Szenarien" geben wird, die sich nicht ideal verhalten.
Die zentrale Erkenntnis ist, dass wir uns nur dann wirklich um Jitter kümmern, wenn der Controller größtenteils stationär ist, und dass wir uns nur wirklich um Verzögerungen kümmern, wenn der Controller bewegt wird. Daher sollte unsere Strategie darin bestehen, zu versuchen, mit den Dingen so umzugehen, dass wir eine Verzögerung haben, wenn der Controller stationär ist, und Jitter haben, wenn der Controller in Bewegung ist.
Hier sind zwei Möglichkeiten, dies zu tun:
Ein gängiger Ansatz ist ein "gesperrtes / entsperrtes" System, bei dem Sie die Ausrichtung des Geräts verfolgen. Wenn sich das Gerät für kurze Zeit (etwa eine halbe Sekunde) nicht ändert, "sperren" Sie diese Ausrichtung, indem Sie "Nein" verwenden Aktion basierend auf der vom Gerät gemeldeten Ausrichtung, bis sie sich so weit unterscheidet, dass sie erneut entsperrt werden kann. Dies kann orientierungsbasierten Jitter vollständig unterdrücken, ohne eine Verzögerung einzuführen, wenn sich die Ausrichtung aktiv ändert. Es kann einen Hinweis auf eine Verzögerung geben, bevor der Code entscheidet, dass er in den "entsperrten" Modus wechseln muss, aber es ist viel besser, als überall eine Verzögerung zu haben.
Ein anderer Ansatz besteht darin, Eingabedaten aus Frames zusammen zu mitteln. Der wichtige Punkt hierbei ist, nur die Eingabedaten aus Frames zu mitteln, in denen die Eingabedaten vage ähnlich waren. Dies bedeutete, dass kleine Jitter zusammen verschwimmen und weicher werden, größere Änderungen jedoch nicht unscharf werden, da ihre Daten nicht verschwimmen ähnlich genug zu den Daten aus vorherigen Frames.
Es gibt auch andere Möglichkeiten, einen ähnlichen Effekt zu erzielen. Die zentrale Erkenntnis ist, dass Sie nicht gleichzeitig Jitter und Lag in Ihrem Echtzeitspiel haben können, da dies Kenntnisse über die Zukunft erfordern würde. Sie müssen also auswählen, wann das Verhalten Ihres Steuerelements auf das Akzeptieren von Jitter und wann auf das Akzeptieren von Verzögerungen ausgerichtet werden soll, um das Gesamterlebnis so schlecht wie möglich zu gestalten.