Die Notwendigkeit für Streamingressourcen

Streamingressourcen werden benötigt, damit GPU-Speicher nicht verschwendet wird, um Bereiche von Oberflächen zu speichern, auf die nicht zugegriffen wird, und um der Hardware mitzuteilen, wie sie über benachbarte Kacheln filtern kann.

Streamingressourcen oder Spärsetexturen

Streamingressourcen (in Direct3D 11 als kachelte Ressourcen bezeichnet) sind große logische Ressourcen, die kleine Mengen physischen Arbeitsspeichers verwenden.

Ein anderer Name für Streamingressourcen ist Sparsetexturen. "Sparse" vermittelt sowohl die kachelnde Natur der Ressourcen als auch vielleicht den Hauptgrund für deren Kacheln - dass nicht alle von ihnen auf einmal abgebildet werden sollen. Tatsächlich könnte eine Anwendung eine Streamingressource erstellen, in der absichtlich keine Daten für alle Regionen+Mips der Ressource erstellt werden. Der Inhalt selbst könnte also sparse sein, und die Zuordnung des Inhalts im GPU-Speicher (Graphics Processing Unit) zu einem bestimmten Zeitpunkt wäre eine Teilmenge davon (noch geringer).

Ohne Kacheln werden Speicherbelegungen bei der Granularität von Untergeordneten Ressourcen verwaltet.

In einem Grafiksystem (betriebssystem, Anzeigetreiber und Grafikhardware) ohne Streamingressourcenunterstützung verwaltet das Grafiksystem alle Direct3D-Speicherbelegungen mit granularer Subressourcen.

Bei einem Puffer ist der gesamte Puffer die Unterressource.

Bei einer Textur (z. B. Texture2D) ist jede Mip-Ebene eine Unterressource; für ein Texturarray (z. B. Texture2DArray) ist jede MIP-Ebene in einem bestimmten Arrayslice eine Unterressource. Das Grafiksystem macht nur die Möglichkeit verfügbar, die Zuordnung von Zuordnungen bei dieser Subressourcengranularität zu verwalten. Im Kontext von Streamingressourcen bezieht sich "Zuordnung" darauf, Daten für die GPU sichtbar zu machen.

Ohne Kacheln kann nicht nur auf einen kleinen Teil der mipmap-Kette zugegriffen werden.

Angenommen, eine Anwendung weiß, dass ein bestimmter Renderingvorgang nur auf einen kleinen Teil einer Mipmap-Bildkette zugreifen muss (vielleicht nicht einmal auf den gesamten Bereich einer bestimmten Mipmap). Im Idealfall könnte die App das Grafiksystem über diese Anforderung informieren. Das Grafiksystem würde sich dann nur darum bemühen, sicherzustellen, dass der benötigte Arbeitsspeicher auf der GPU zugeordnet wird, ohne zu viel Arbeitsspeicher auslagern zu müssen.

In Wirklichkeit kann das Grafiksystem ohne Unterstützung von Streamingressourcen nur über den Arbeitsspeicher informiert werden, der auf der GPU bei der Subressourcengranularität zugeordnet werden muss (z. B. ein Bereich vollständiger Mipmap-Ebenen, auf die zugegriffen werden konnte). Es gibt auch keine Nachfragefehler im Grafiksystem, sodass möglicherweise viel überschüssiger GPU-Arbeitsspeicher verwendet werden muss, um vollständige Unterressourcen zu erstellen, die zugeordnet werden, bevor ein Renderingbefehl ausgeführt wird, der auf einen Teil des Arbeitsspeichers verweist. Dies ist nur ein Problem, das die Verwendung großer Speicherbelegungen in Direct3D ohne Unterstützung von Streamingressourcen erschwert.

Software-Paging zum Aufteilen der Oberfläche in kleinere Kacheln

Software-Paging kann verwendet werden, um die Oberfläche in Kacheln aufzuteilen, die klein genug sind, damit die Hardware sie verarbeiten kann.

Direct3D unterstützt Texture2D-Oberflächen mit bis zu 16384 Pixeln auf einer bestimmten Seite. Ein Bild, das 16384 breit, 16384 hoch und 4 Bytes pro Pixel ist, würde 1 GB Videospeicher verbrauchen (und das Hinzufügen von Mipmaps würde diese Menge verdoppeln). In der Praxis müsste selten auf alle 1 GB in einem einzelnen Renderingvorgang verwiesen werden.

Einige Spieleentwickler modellieren Geländeflächen, die so groß sind wie 128K x 128K. Die Art und Weise, wie dies auf vorhandenen GPUs funktioniert, besteht darin, die Oberfläche in Kacheln zu unterteilen, die klein genug für die Hardware sind. Die Anwendung muss herausfinden, welche Kacheln möglicherweise benötigt werden, und sie in einen Cache mit Texturen auf der GPU laden – ein Softwareauslagerungssystem.

Ein erheblicher Nachteil dieses Ansatzes ist, dass die Hardware nichts über das Paging weiß, das geschieht: Wenn ein Teil eines Bilds auf dem Bildschirm angezeigt werden muss, der Kacheln überspannt, weiß die Hardware nicht, wie eine feste Funktion (d. h. effiziente) Filterung zwischen Kacheln ausgeführt werden kann. Dies bedeutet, dass die Anwendung, die ihre eigenen Softwarekacheln verwaltet, auf die manuelle Texturfilterung im Shadercode zurückgreifen muss (was sehr teuer wird, wenn ein anisotroper Filter von guter Qualität gewünscht wird) und/oder Speichererstellungsrinnen um Kacheln verschwenden muss, die Daten von benachbarten Kacheln enthalten, sodass die Hardwarefilterung mit festen Funktionen weiterhin einige Unterstützung bieten kann.

Erstellen einer kachelbasierten Darstellung von Flächenzuordnungen zu einem erstklassigen Feature

Wenn eine gekachelte Darstellung von Flächenbelegungen ein erstklassiges Feature im Grafiksystem ist, könnte die Anwendung der Hardware mitteilen, welche Kacheln zur Verfügung gestellt werden sollen. Auf diese Weise wird weniger GPU-Speicher verschwendet, um Bereiche von Oberflächen zu speichern, von denen die Anwendung weiß, dass nicht auf sie zugegriffen wird, und die Hardware kann verstehen, wie sie über benachbarte Kacheln filtern kann, was einige der Probleme von Entwicklern verringert, die Softwarekacheln selbst durchführen.

Aber um eine komplettlösung zu bieten, muss etwas getan werden, um die Tatsache zu bewältigen, dass unabhängig davon, ob fliesen innerhalb einer Oberfläche unterstützt wird, die maximale Oberflächendimension derzeit 16384 beträgt - bei weitem nicht die 128K+ , die Anwendungen bereits wollen. Es ist ein Ansatz, dass die Hardware größere Texturgrößen unterstützt, es gibt jedoch erhebliche Kosten und/oder Nachteile für diese Route.

Der Texturfilterpfad und der Renderingpfad von Direct3D sind bereits in Bezug auf die Genauigkeit bei der Unterstützung von 16K-Texturen mit den anderen Anforderungen gesättigt, z. B. unterstützung von Viewport-Blöcken, die während des Renderings von der Oberfläche fallen, oder unterstützende Texturumschließungen vom Oberflächenrand während der Filterung. Eine Möglichkeit besteht darin, einen Kompromiss zu definieren, so dass, wenn die Texturgröße über 16K steigt, Funktionalität/Genauigkeit in irgendeiner Weise aufgegeben wird. Selbst mit dieser Konzession können jedoch zusätzliche Hardwarekosten in Bezug auf die Adressierungsfunktion im gesamten Hardwaresystem erforderlich sein, um zu größeren Texturgrößen zu wechseln.

Problem mit großen Texturen: Genauigkeit für Standorte auf der Oberfläche

Ein Problem, das ins Spiel kommt, wenn Texturen sehr groß werden, besteht darin, dass die Texturkoordinaten mit einfacher Genauigkeit (und die zugehörigen Interpolatoren zur Unterstützung der Rasterung) keine Genauigkeit mehr haben, um Orte auf der Oberfläche genau anzugeben. Eine Jittery-Texturfilterung würde sich ergeben. Eine teure Option wäre die Unterstützung von Interpolatoren mit doppelter Genauigkeit, obwohl dies bei einer vernünftigen Alternative übermäßig sein könnte.

Aktivieren mehrerer Ressourcen mit unterschiedlichen Dimensionen zum Freigeben von Arbeitsspeicher

Ein weiteres Szenario, das von Streamingressourcen bedient werden kann, ist die Aktivierung mehrerer Ressourcen mit unterschiedlichen Dimensionen/Formaten, um denselben Arbeitsspeicher gemeinsam zu nutzen. Manchmal verfügen Anwendungen über exklusive Sätze von Ressourcen, die bekanntlich nicht gleichzeitig verwendet werden, oder Ressourcen, die nur für eine sehr kurze Verwendung erstellt und dann zerstört werden, gefolgt von der Erstellung anderer Ressourcen. Eine Form der Allgemeinheit, die aus "Streamingressourcen" herausfallen kann, besteht darin, dass der Benutzer mehrere verschiedene Ressourcen auf denselben (überlappenden) Arbeitsspeicher verweisen kann. Anders ausgedrückt: Die Erstellung und Zerstörung von "Ressourcen" (die eine Dimension/ein Format definieren usw.) kann aus Anwendungssicht von der Verwaltung des Den Ressourcen zugrunde liegenden Arbeitsspeichers entkoppelt werden.

Streamingressourcen