Ja das ist schon ein schwierig zu antizipierender Prozess. Also wenn die Daten mit RTX I/O und DS den Vram Buffer nicht ersetzen können, wie soll dann SF das ja von der SSD in deiner Phantasiewelt die Daten direkt zur GPU bringt und damit den Vram ersetzt kompensieren?
Puh, jetzt muss ich wohl von vorne anfangen. Nirgends steht was von VRAM Buffer, sondern Frame-Buffer. Den gibt es weiterhin, der ist aber erst mal irrelevant weil erst
am Ende des Rendervorgangs dort die fertig gerenderten Bilder abgelegt werden zur Ausgabe an den Monitor.
Ich habe übrigens auch nirgends behauptet dass irgendwas den VRAM ersetzt. Nirgends... Sampler Feedback Streaming
reduziert allerdings den benötigten Platz für Texturen im VRAM. Wie macht es das? Ist eigentlich im Video erklärt, aber ich führe mal aus. Dazu erst mal ein paar Grundlagen:
1. Wie sind Texturen überhaupt in einer Spieleinstallation vorhanden?
Es gibt von jeder Textur mehrere MIP Level. Heißt jede Textur ist mehrfach vorhanden.
Was sind nun MIP Level?
Sagen wir ein Spiel hat MIP 0 - 10. MIP 0 ist immer die maximal aufgelöste Textur, verbraucht also auch den meisten Speicherplatz im VRAM. MIP 10 dagegen ist die niedrigst aufgelöste Textur und verbraucht am wenigsten Platz im VRAM, usw usf.
Je weiter entfernt man von einer Textur in der Spiele-Welt ist, desto "höher" (ergo geringere Textur Auflösung) kann das MIP Level der Textur sein da auf die Entfernung hochaufgelöste Texturen keinen Mehrwert bringen. Game Devs nutzen MIP Levels schon ewig und stellen in der Engine das LOD (Level of Detail) ein. LOD beinhaltet sowohl die Geometrie Genauigkeit als auch das MIP Level der Texturen.
Hier ein Mipmapped Texture Asset mit 8 MIP Leveln:
Jede Textur wird noch gefiltert (z.B. Bilinear, Trilinear, Anisotropic) um flackern und aliasing zu minimieren.
2. Was macht eigentlich Sampling?
Filtering passiert beim Sampling. Sampling an sich beschreibt den Prozess um Daten von einer Textur zu einem Pixel zu erhalten.
Während des "sampling" muss der Sampler herausfinden welche Textur Daten er in welcher Auflösung benötigt. Diese Info wurde bisher nach dem samplen verworfen.
3. Wie funktioniert eigentlich Texture Streaming und welche Arten gibt es? Und warum überhaupt Streamen?
Zuerst: Warum Streamen? Weil der VRAM nicht so schnell ansteigt wie die Größe der Texturen. Auch 16GB sind bei weitem nicht ausreichend um auf Streaming zu verzichten. Also optimiert man das Streaming um möglichst wenig VRAM zu belegen. Ohne Streaming müssten alle Texturen eines gesamten "Levels" eines Spiels in den VRAM geladen werden.
Texture Streaming Arten:
- Klassisch
- PRT (Partial Resident Texture / Virtual Texture)
- PRT+SF (Sampler Feedback)
- SFS (Sampler Feedback Streaming)
Klassisch: Es werden die Texturen im passenden MIP Level gestreamt, also nicht immer MIP 0 sondern MIP 0-10 je nach Entfernung zum Objekt.
PRT: Hierbei werden die Texturen in jedem MIP Level noch mal in Tiles aufgeteilt. Eine vom Sampler fertig erstellte Textur kann dabei verschiedene MIP Level einer Textur kombinieren.
Das Problem mit PRT: Es basiert auf Vermutungen zur Sichtbarkeit und Wichtigkeit von Objekten da es kein Feedback vom Sampler gibt (siehe oben, alles vom Sampler wird verworfen). Heißt die Game Devs können nur per trial-and-error eine Einstellung finden die wenig Artefakte (LOD "pop-in") produziert und gleichzeitig nicht zu viel VRAM verbraucht.
PRT+SF: Gibt es erst seit DX12 Ultimate, hiermit gibt es erstmals Feedback vom Sampler. Das Streaming basiert hier nicht auf Vermutungen, sondern Fakten die direkt vom Sampler kommen. Somit bekommen Game Devs Info darüber was sampled wurde und können steuern welches MIP Level für welches Objekt benötigt wird. Damit lassen sich Artefakte (LOD "pop-in") und Lag Spikes weiter reduzieren (Nachladeruckler) und zusätzlich der VRAM Bedarf minimieren (es werden nur noch die Tiles der verschiedenen MIP Level einer Textur geladen die auch aktuell benötigt werden). PRT+SF benötigt Hardware Support (RTX 2000 / RDNA1 oder Neuer).
SFS: Hier kommen noch Software Optimierungen dazu.
1. Microsoft hat Caches für die Residency Map und Request Map hinzugefügt und zeichnet die Asset-Anfragen on the fly auf. Anhand der Residency Map weiss das Spiel welche Tiles von welchem MIP Level der Texturen aktuell im VRAM geladen sind. Die Request Map dient der besseren Prediction.
2. Man braucht eine NVME SSD um PRT+ zu verwenden. Eine HDD ist zu langsam, eingehende Asset Anfragen müssen innerhalb von Millisekunden bearbeitet werden. Hier kommt dann die DirectStorage / RTX IO API zur Beschleunigung ins Spiel.
3. Microsoft hat eine neue Methode zur Texturfilterung und -schärfung auf der Xbox Series X implementiert. Dies wird verwendet, um den Ladeübergang von MIP8 zu MIP4 oder MIP0...etc. zu glätten. Ob das auch auf den aktuellen Grafikkarten verfügbar ist konnte ich leider nicht verifizieren (sollte es aber, ist ja Software-basiert -> DX12).
Wie funktioniert nun SFS?
Der Sampler weiß was er braucht. Er kann auf die Anforderung zu MIP0 antworten, indem er MIP 0.8 auf Frame 1, MIP 0.4 auf Frame 2 und schließlich MIP 0 auf Frame 3 ausgibt. Das wären bei 60 Hz / FPS ganze 99ms Verzögerung, allerdings mit einem fließenden Übergang von niedrig zu hoch aufgelöster Textur.
Durch die Verzögerung hat das Speichersystem mehr Zeit, Assets zu laden, ohne Artefakte (LOD "pop-in") zu zeigen.
SF reduziert lediglich die Streaming-Datenmenge,
Menge der Daten und Übertragungsgeschwindigkeit des Bus bestimmen die Geschwindigkeit des Streamings.
Das ermöglicht es, LOD deutlich zu reduzieren sowie Datenmengen klein zu halten im Ram da diese dort komprimiert abgelegt werden können. Was man jedoch sieht ist IMMER IM VRAM und sobald auch nur die entfernte Möglichkeit besteht dass man sich in einer Software um das Objekt herum bewegen kann, wird dies auch vollständig im Vram abgelegt.
Korrekt, SF reduziert die Streaming-Datenmenge
und die Datenmenge die im VRAM vorgehalten werden muss. Per DirectStorage wird im RAM zwischengespeichert, per RTX IO direkt im VRAM.
Nein, es werden nicht alle Texturen eines Objekts um das man sich herum bewegen kann geladen, siehe
Video:
Hier sieht man welche Tiles in welchem MIP Level der "Weltkugel Textur" geladen wurden. Sobald man sich um das Objekt bewegt werden in real-time die anderen Tiles nachgeladen, und nicht mehr benötigte werden verworfen.
Alles andere ist euer Hirngespienst damit Ihr euch euren kleinen Vram schön schnabeln könnt, nichts weiter. Nirgends in dem Thema SF wird gesagt dass damit der Vram reduziert wird, Ihr macht halt einfach mal aus Memory euren Vram im Kopf und flux ist die Welt wieder gerade.
Doch, wird gesagt, im oben verlinkten Video: "efficiency gain as a multiplier on our graphics memory size".
Das ganze führt am Ende zu einem noch höheren Vram Bedarf, da die Entwickler so einfach das LOD reduzieren können ohne viel Aufwand. Ein permanentes STreaming von der SSD ist allein schon von der Hardware nicht möglich, eine SSD wird glühend heiß wenn diese ununterbrochen Daten schaufelt mit voller Geschwindigkeit, jedes SSD drosselt bereits nach spätestens einigen Minuten.
Die SSD schaufelt sowieso ständig Daten in den RAM / VRAM da
immer gestreamt wird. Noch mal:
KEIN Level eines aktuellen Spiels passt in den VRAM irgendeiner Consumer Grafikkarte. Keine Ahnung was ein effizienteres Streaming da jetzt plötzlich an Extra-Hitze erzeugen soll. Klingt eher nach "Argument aus den Fingern gesogen".
Edit 2: Übrigens verdoppelt sich die Leseleistung der SSD durch RTX IO fast da die Daten komprimiert übertragen werden:
https://www.pcgameshardware.de/Nvid...mierung-Overhead-erklaert-neue-Infos-1357550/
RTX IO hingegen sei unabhängig der SSD-Leistung nutzbar. Das Komprimierungsverhältnisse liege typischerweise bei 2:1, wodurch die Leseleistung einer SSD laut Nvidia effektiv um das Zweifache ansteigt.
Das bisjen Vram was man sich damit spart wird an allen Enden und Kanten doppelt wieder aufgefressen werden.
Zudem sollte auch klar sein, SF kann nicht eingesetzt werden mit Raytracing, weil ein Objekt was nicht gerendert ist kann auch keine Bounces empfangen oder senden.
Das bisschen? Siehe oben, bis zu 70% weniger VRAM Bedarf sind möglich. Selbst wenn es im Schnitt nur 50% Ersparnis sind ist das ein absoluter Gamechanger.
Was RT betrifft, doch, es funktioniert. Weil die hohen MIP Level sowieso geladen sind (siehe oben die Weltkugel), für ein "blaues" Bounce-Light reicht auch MIP10. Was RT Reflections angeht muss man halt schauen wie hoch aufgelöst man sie haben möchte. Die Texturen der Objekte vor einem Spiegel müssten dann eben höher aufgelöst geladen werden. Aber RT Reflections sind sowieso nie in voller Auflösung zu sehen.
Edit: Hier noch ein zusammenfassendes Zitat:
Mit den neuen DirectStorage-APIs und der neuen Hardware-Dekomprimierung können wir die I/O-Leistung weiter verbessern und den CPU-Overhead reduzieren. Beides ist für ein schnelles Laden unerlässlich. Wenn wir in die Zukunft blicken, ist das Sampler Feedback for Streaming (SFS) der Xbox Series X ein Grundpfeiler unserer Denkweise über Welt-Streaming und visuelle Detailgenauigkeit. Wir werden untersuchen, wie wir es in zukünftigen Titeln verwenden können, um sowohl die Texturdetails in unserem Spiel über das hinaus zu verbessern, was wir in den Speicher einpassen können, als auch die Ladezeiten weiter zu reduzieren, indem wir das Laden von Dingen kurz vor Bedarf verstärken, anstatt wie in einem traditionellen Ansatz alles im Voraus zu laden