Frame Generation

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Jonathan
Establishment
Beiträge: 2762
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Frame Generation

Beitrag von Jonathan »

Moin,

wie funktioniert eigentlich Frame-Generation? Also jetzt insbesondere in Hinblick auf Latenz.

Also, das Generieren ansich scheint klar. Man könnte irgendein halbwegs effizientes Neuronales Netzwerk nehmen, gibt ihm 2 gerenderte Frames und vielleicht noch Zusatzinfos wie Kamerabewegung und Tiefenkarte und herauskommt eine temporale Interpolation beider Bilder - das Frame was gut dazwischen passen könnte.

Aber wie sieht dazu die Zeitachse aus? Ich habe mal eine professionelle Skizze angefertigt:
frame generation.png
frame generation.png (3.5 KiB) 103 mal betrachtet
Man sieht zwei Zeitachse, oben ohne Frame-Generation, unten mit. A und B sind zwei Frames die gerendert werden, in Gelb ist der interpolierte Frame eingezeichnet.
Jetzt sieht man in der Mitte noch in Blau die Eingabe und in Hellblau die Eingabe Latenz. Man drückt eine Taste, die Spielwelt wird aktualisiert und ein neuer Frame gerendert und kurz darauf angezeigt. Das ist der Fall oben, die Latenz ist nett und kurz.
Ok, wenn jetzt Framegeneration 2 Bilder interpoliert, müssen dafür beide fertig sein. Zusätzlich benötigt das Generieren auch minimal Zeit, also kommt der gelbe Strich unten kurz nach dem grünen Strich oben. Man will vielleicht gleichmäßige Frame-unterschiede haben, also wird rot und grün entsprechend nach hinten geschoben, so dass die Framerate verdoppelt wird.

Jetzt hat man im Ergebnis zwar doppelt so viele Frames, aber die Eingabelatenz wurde auch mehr als verdoppelt. Ist das im Wesentlichen, was in echt so passiert? Als Alternative viele mir noch ein, dass man ja vielleicht statt Interpolation auch Extrapolation machen könnte, d.h. man schaut sich den letzten und vorletzten Frame an und rät, wie der nächste Aussehen könnte - allerdings ist das bei jeder Art von Richtungsänderung natürlich ein viel schwierigeres Problem für das Netzwerk, und wenn es falsch liegt wird man das in deutlichen Sprüngen sehen. Aber zumindest könnte man so ggf. die Latenz unverändert lassen, weil man Frame A und B zum selben Zeitpunkt wie zuvor anzeigen könnte.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
NytroX
Establishment
Beiträge: 417
Registriert: 03.10.2003, 12:47

Re: Frame Generation

Beitrag von NytroX »

Ja, also du hast vollkommen recht mit deinen Vermutungen.

Der Ansatz für das klassische Generieren von Frames basiert auf Interpolation, d.h. die Graka muss warten bis Frame "B" erstellt wurde und erstellt dann 1 oder 2 Frames zwischen A und B. Das System zeigt dann Frame A später an und es entsteht eine Latenz. Und zwar sowohl weil man auf "B" warten muss bis die Interpolation starten kann und auch weil die AI ja Zeit braucht um den Frame zu berechnen. Bei einer menschlichen Reaktionsgeschwindigkeit von > 100ms sind aber 10ms (z.B. bei 100 Hz) oft vernachlässigbar. Dafür hat man halt quasi 100 FPS statt 50 oder 35.
Im Prinzip kompensiert man ja eigentlich nur das Ruckeln über AI.
https://humanbenchmark.com/tests/reactiontime -> versuch mal :-)
Hier das Video hat nette Bilder und zeigt auch die zusätzliche Latenz (um mal ein paar realistische Zahlen zu sehen welche Auswirkung das hat): https://youtu.be/EiOVOnMY5jI?t=401

Es gibt aber auch Extrapolation, d.h. man generiert einen zukünftigen Frame basierend auf den letzten paar Frames. Das ist zwar dann nur ein Forecast, aber es reduziert gefühlt die Latenz. Das macht man oft bei Cloud-Play Sachen bei denen Server-seitig gerendert wird.
Da kommt die zusätzliche Latenz durch das Netzwerk/Streaming. Da die Steuerung aber auch übermittelt wird (also vom Client zum Server) und dadurch auch Latenz hat, ist das Rendering bei Richtungswechseln sowieso langsam und ungenau und dann ist der Forecast egal.
Zudem wird auch neben den letzten Frames der Game/Controller Input verwendet als Input für die AI, d.h. der Forecast versteht dann auch Richtungswechsel. Man bekommt tatsächlich insgesamt das Gefühl dass das Spiel irgendwie besser läuft und schneller reagiert.
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 617
Registriert: 05.07.2003, 11:17

Re: Frame Generation

Beitrag von Lord Delvin »

Hatte auch mal über AI-PostFX nachgedacht und im Prinzip so ne Art low-quality Bild reingepackt und dann mit Worten + AI Bilder draus gemacht; wenn man sich das mal genau anschaut ist das alles viel zu langsam und die Fehlerrate ist viel zu hoch. Wenn du vier Bilder generierst und eins davon ist gut, geht das für Webservices. Wenn du das als PostFX machst bedeutet es, dass du Sekunden hast, in denen quasi jedes AI-generierte Bild murks ist. Das wird sich nicht wirklich gut anfühlen. Rein konzeptionell hätte ich für deine Idee sowas gemacht, wie die letzten drei Bilder und dann ein extrapoliertes und nur, wenn die aktuelle Framerate unter der Hälfte des Displays liegt. Wenn du 100 FPS statt 50 willst hättest du nach meiner Rechnung 5ms das Bild zu generieren. Scheint mir momentan bei 4k nicht machbar.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Krishty
Establishment
Beiträge: 8372
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Frame Generation

Beitrag von Krishty »

Lord Delvin hat geschrieben: Gestern, 16:51Hatte auch mal über AI-PostFX nachgedacht und im Prinzip so ne Art low-quality Bild reingepackt und dann mit Worten + AI Bilder draus gemacht; wenn man sich das mal genau anschaut ist das alles viel zu langsam und die Fehlerrate ist viel zu hoch
Damit verlässt du jetzt natürlich das Thema, aber: Das wird schon lange gemacht und ist ausreichend schnell, nur hakt’s an der Qualität. Auf AMD-Karten heißt es FidelityFX; bei Nvidia habe ich den Namen vergessen.

Man rendert das Bild bspw. bei halber Auflösung und lässt es durch ein NN heraufskalieren. Der Unterschied zu deinem Vorschlag – und zugleich der Grund, warum es echtzeitfähig ist: Das NN ist konkret auf deinem Spiel trainiert worden und nicht auf Milliarden Videos aus dem Internet.

Pixel vorherzusagen kann schneller sein als sie zu berechnen, und das verbessert wohl wirklich die Frame-Rate. Auf den letzten Videos, die ich mir davon angesehen habe, waren aber noch deutlich Artefakte zu sehen.

Shader Model 6.9 führt auch extra Cooperative Vector ein, damit so etwas in HLSL-Shadern verwendet/implementiert werden kann statt über ein Hersteller-spezifisches SDK.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten