Freigeben über


Die Notwendigkeit für Streamingressourcen

Streamingressourcen sind erforderlich, sodass gpu-Speicher nicht verschwendet wird, um Regionen von Oberflächen zu speichern, auf die nicht zugegriffen werden kann, und um die Hardware mitzuteilen, wie sie über angrenzende Kacheln gefiltert werden.

Streamingressourcen oder geringe Texturen

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

Ein weiterer Name für Streamingressourcen ist geringe Texturen. "Sparse" vermittelt sowohl die nebeneinander angeordnete Natur der Ressourcen als auch vielleicht den Hauptgrund für die Tilung dieser Ressourcen - dass nicht alle gleichzeitig zugeordnet werden sollen. Tatsächlich könnte eine Anwendung denkbar eine Streamingressource erstellen, in der keine Daten für alle Regionen+Mips der Ressource erstellt werden, absichtlich. Der Inhalt selbst könnte also spärlich sein, und die Zuordnung des Inhalts in Grafikverarbeitungseinheitsspeicher (GPU) zu einem bestimmten Zeitpunkt wäre eine Teilmenge davon (noch sparsamer).

Ohne Tilung werden Speicherzuordnungen bei der Subresource-Granularität verwaltet.

In einem Grafiksystem (d. h. dem Betriebssystem, dem Anzeigetreiber und der Grafikhardware) ohne Streamingressourcenunterstützung verwaltet das Grafiksystem alle Direct3D-Speicherzuordnungen bei der Subresource-Granularität.

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 Arraysegment eine Unterressource. Das Grafiksystem macht nur die Möglichkeit verfügbar, die Zuordnung von Zuordnungen an dieser Unterressource granularität zu verwalten. Im Kontext von Streamingressourcen bezieht sich "Mapping" auf die Darstellung von Daten für die GPU.

Ohne Tilung 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 Bild-Mipmap-Kette zugreifen muss (vielleicht nicht einmal der vollständige Bereich einer bestimmten Mipmap). Im Idealfall könnte die App das Grafiksystem über diese Notwendigkeit informieren. Das Grafiksystem würde dann nur stören, um sicherzustellen, dass der erforderliche Speicher auf der GPU zugeordnet wird, ohne zu viel Arbeitsspeicher auslagerungen zu müssen.

Ohne Streamingressourcenunterstützung kann das Grafiksystem nur über den Speicher informiert werden, der auf die GPU bei der Subresource-Granularität zugeordnet werden muss (z. B. eine Reihe vollständiger Mipmap-Ebenen, auf die zugegriffen werden kann). Im Grafiksystem gibt es keinen Bedarf, daher muss möglicherweise viel übermäßig viel GPU-Speicher verwendet werden, um vollständige Unterressourcen zuzuordnen, bevor ein Renderingbefehl, der auf einen Teil des Arbeitsspeichers verweist, ausgeführt wird. Dies ist nur ein Problem, das die Verwendung großer Speicherzuordnungen in Direct3D ohne Streamingressourcenunterstützung erschwert.

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

Software-Paging kann verwendet werden, um die Oberfläche in Kacheln zu unterteilen, die klein genug sind, damit die Hardware verarbeitet werden kann.

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

Einige Spieleentwickler modellieren Geländeflächen so groß wie 128K bis 128K. Die Art und Weise, wie sie dies erreichen, um an vorhandenen GPUs zu arbeiten, besteht darin, die Oberfläche in Kacheln zu unterteilen, die klein genug sind, um Hardware zu verarbeiten. Die Anwendung muss herausfinden, welche Kacheln benötigt werden können, und sie in einen Cache von Texturen auf der GPU laden – ein Software-Paging-System.

Ein erheblicher Nachteil für diesen Ansatz kommt von der Hardware, die nichts über das Paging weiß, das gerade läuft: Wenn ein Teil eines Bilds auf dem Bildschirm angezeigt werden muss, der Kacheln überspannt, weiß die Hardware nicht, wie feste Funktionen (d. h. effiziente) Filterung über Kacheln hinweg ausgeführt werden. Dies bedeutet, dass die Anwendung, die ihre eigene Software-Tiling verwaltet, auf die manuelle Texturfilterung im Shadercode zurückgreifen muss (was sehr teuer wird, wenn ein qualitativ hochwertiger anisotroper Filter gewünscht wird) und/oder die Speichererstellungs-Bundsteg um Kacheln, die Daten aus benachbarten Kacheln enthalten, sodass die Hardwarefilterung mit festen Funktionen weiterhin Unterstützung bieten kann.

Erstellen einer nebeneinander angeordneten Darstellung von Oberflächenzuweisungen zu einem erstklassigen Feature

Wenn eine nebeneinander angeordnete Darstellung von Oberflächenzuweisungen ein erstklassiges Feature im Grafiksystem ist, könnte die Anwendung der Hardware mitteilen, welche Kacheln verfügbar sind. Auf diese Weise wird weniger GPU-Speicher verschwendet, um Bereiche von Oberflächen zu speichern, von denen die Anwendung weiß, dass nicht zugegriffen wird, und die Hardware kann verstehen, wie sie über angrenzende Kacheln gefiltert werden, wodurch einige der Schmerzen von Entwicklern verringert werden, die softwarekacheln auf eigene Faust durchführen.

Aber um eine vollständige Lösung zu bieten, muss etwas getan werden, um mit der Tatsache zu umgehen, dass, unabhängig davon, ob Kacheln innerhalb einer Oberfläche unterstützt werden, die maximale Oberflächendimension derzeit 16384 beträgt - nirgendwo in der Nähe der 128K+ die anwendungen bereits wollen. Die Hardware zur Unterstützung größerer Texturgrößen erfordert nur einen Ansatz, aber es gibt erhebliche Kosten und/oder Nachteile, um diese Route zu gehen.

Der Texturfilterpfad und der Renderingpfad von Direct3D sind bereits hinsichtlich der Genauigkeit bei der Unterstützung von 16K-Texturen mit den anderen Anforderungen gesättigt, z. B. unterstützung von Viewport-Ausmaßen, die während des Renderings auf die Oberfläche fallen, oder die Unterstützung des Texturumbruchs während der Filterung vom Oberflächenrand. Eine Möglichkeit besteht darin, einen Kompromiss zu definieren, z. B. dass die Texturgröße über 16 KB hinausgeht, Funktionalität/Genauigkeit auf irgendeine Weise aufgegeben wird. Auch bei dieser Konzession sind möglicherweise zusätzliche Hardwarekosten im Hinblick auf die Adressierungsfähigkeit im gesamten Hardwaresystem erforderlich, um zu größeren Texturgrößen zu wechseln.

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

Ein Problem, das beim Auftreten von Texturen sehr groß ist, ist, dass einzelne Genauigkeit Gleitkommatexturkoordinaten (und die zugehörigen Interpolatoren zur Unterstützung der Rasterung) nicht mehr präzise sind, um Positionen auf der Oberfläche genau anzugeben. Jittery Texturfilterung würde ensue. Eine teure Option wäre es, eine doppelte Genauigkeit Interpolatorunterstützung zu erfordern, obwohl dies überlastbar sein könnte, wenn eine vernünftige Alternative gegeben werden könnte.

Aktivieren mehrerer Ressourcen unterschiedlicher Dimensionen zum Freigeben des Arbeitsspeichers

Ein weiteres Szenario, das von Streamingressourcen bereitgestellt werden kann, besteht darin, dass mehrere Ressourcen unterschiedlicher Dimensionen/Formate denselben Arbeitsspeicher gemeinsam nutzen können. Manchmal verfügen Anwendungen über exklusive Ressourcengruppen, die nicht gleichzeitig verwendet werden können, oder Ressourcen, die nur für 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 es möglich ist, dem Benutzer zu ermöglichen, mehrere verschiedene Ressourcen auf denselben (überlappenden) Speicher zu verweisen. Mit anderen Worten, die Erstellung und Zerstörung von "Ressourcen" (die ein Dimension/Format definieren usw.) können von der Verwaltung des Speichers entkoppelt werden, der den Ressourcen zugrunde liegt, aus sicht der Anwendung.

Streamingressourcen