@Wolfgang Das ist soweit alles richtig.
In Engine Input-Lag ist in den meisten Faellen aber deutlich mehr als nur ein game frame.
Ich halte das Ganze mal im Kontext nur fuer UE5, da Latewarp ja bisher auch nur fuer Unreal gezeigt wurde und es nicht bekannt ist ob andere Engines unterstuetzt werden.
- Als erstes wird die Spiele-logik im Gamethread berechnet. Das ist frame n. Dort wird auch der Input abgefragt, um zum Beispiel die Kamera zu bewegen wenn die Maus bewegt wurde.
- Der Render thread arbeitet zur gleichen Zeit daran die informationen der Spielszene fuer die GPU zu berechnen. Er nutzt dafuer die informationen vom verhergehenden Gamethread frame (n-1)
- Die GPU rendered zur gleichen Zeit die Szene, die der Renderthread zuvor berechnet hat, also n-2
- Erst wenn die GPU fertig ist landet das Bild im back-buffer und wird dann bei naechster Gelegenheit (vsync kann hier zusaetzlich Wartezeit verursachen) auf dem Monitor gezeigt
Das ist so UE default (z.B. Fortnite), da es die stabilste Bildrate und beste Performance gibt und das input-lag noch akzeptabl ist. UE kann auch anders konfiguriert werden, z.B. wenn ein Spiel auf der CPU sehr schnell ist kann
r.OneFrameThreadLag ausgeschaltet werden.
Siehe dazu auch
https://dev.epicgames.com/documenta...ne/low-latency-frame-syncing-in-unreal-engine
r.GTSyncType 2 ist nur fuer Konsolen aber macht im Prinzip das, was Reflex und co auf dem PC machen. Die Idee ist, dass wenn Spiele im GPU bottleneck sind, die Arbeit auf der CPU verzoegert gestartet werden kann, damit sie grade rechtzeitig fertig sind wenn die GPU fuer den naechsten Frame bereit ist.
In Unreal macht das Reflex indem ein "Reflex wait" am Anfang des Gamethreads hinzugefuegt wird und die Input Abfrage so weit wie moeglich herausgezoegert wird.
Beispielszenario: Spiel lauft mit 120 FPS, GPU bottlenecked
- GPU 8ms
- Renderthread 5ms
- Gamethread 5ms
Ohne Reflex sind das 25ms in-Engine lag. Mit Reflex 18ms. Wenn ich jetzt Valorant mit 500 FPS spiele dann sind die Zahlen ohnehin so niedrig, dass das Ganze keine grosse Rolle mehr spielt.
Latewarp kann dagegen direkt auf der GPU arbeiten. Ohne eingestufte Informationen laesst sich nicht genau sagen, an welcher Stufe im rendering auf der GPU latewarp passiert.
Die GPU kommuniziert laufend mit der CPU ueber den RHI thread, kann so also einen neueren Input-stand so abfragen. "Gefueltes" in-engine lag kann so auf sehr wenige ms, z.B. 5, reduziert werden.
Das macht schon einen unglaublich grossen Unterschied. Jeder shooter kann sich damit genauso direkt anfuehlen wie Valorant.
Die Schwierigkeiten liegen einerseits mit dem auseinander-pfluecken der Szene und andereseits mit dem Luecken fuellen.
Das Fuellen an den Raendern des Bildschirms wurde ja schon angesprochen. Ich sehe das aber als das kleinere Problem. Klar kann es hier Bildfehler geben. Der Algorithmus weiss eben gar nicht, was in der Richtung, wo man sich hin dreht, zum Vorschein kommen soll. Aber man muss sich schon sehr schnell drehen damit mehr als ein paar Pixel-linien gefuellt werden und in dem Fall schaut man eh nicht praezise an den Rand. Am ehesten fallen noch grosse Helligkeitsschwankungen auf.
Die grossere Schwierigkeit ist, dass es in den meisten Spielen Elemente gibt, die mehr oder weniger direkt an die Bewegung der Kamera gebunden sind. Latewarp muss in der Lage sein, von der Spieler-Kamera kontrollierte Elemente wie die Waffe im First Person Shooter und den Hintergrund auseinander zu halten. Die Waffe soll immer im gleichen Bereich des Bildes sein, wird also nicht "gewarped". Nur der Hintergrund wird verschoben. Wenn ich jetzt so eine Loesung wie Latewarp entwickeln moechte, stehe ich vor dem Problem irgendwie automatisch erkennen zu muessen, welches Element wozu gehoert.
Dazu kommt, dass Unreal nicht mal einen offiziellen first person mode hat(te). Gibts jetzt seit UE5.6 erst in Beta. Alle Spiele, die schon auf dem Markt sind, haben ihre eigene Implementierung und entsprechend gibt es auch keinen Standard, dem man folgen kann. Klar kann der Spieleentwickler manuall jedes Objekt entsprechend klassifizieren, aber der Status eines Objekts kann sich auch dynamisch aendern. Zum Beispiel wenn man die Waffe auf den Boden wirft. Dann ist sie auf einemal Teil des Hintergrund. Den Aufwand werden wohl nur wenige groessere Teams machen wollen. Dazu kommt, dass irgendwelche Fehler in der Mitte des Bilschirms, wo die Waffe/Optik ist, viel mehr auffallen, als am Rand.
Es ist also eine sehr spannde Technik, die grosses Potential hat aber mit grossen Herausforderungen kommt. Wann es raus kommt, haengt wirklich nur davon ob, wie viele Spiele Nvidia von Anfang an unterstuetzen will. Das DLSS plugin fuer Unreal hat schon seir vielen Monaten Latewarp Unterstuetzung. Ist hier verfuegbar:
https://developer.nvidia.com/rtx/dlss?sortBy=developer_learning_library/sort/featured:desc,title:asc
Nvidia sucht wohl eine Loesung, die fuer alle Spiele funktioniert. Dann koennten sie im Treiber steuern, welches Spiel unterstuetzt wird, so wie AMD es mit FSR4 macht. Aber viele Spiele werden eben in bestimmten Szenarien Grafikfehler genau da haben, wo man sie nicht haben will. Zum Beispiel mit der Waffenoptik, wo dann ein Reflexvisier nicht richtig gehandhabt wird, weil translucency fuer so einen Algoithmus schwer zu handhaben ist.