Auswählen einer Ressource (Direct3D 10)

Eine Ressource ist eine Sammlung von Daten, die von der 3D-Pipeline verwendet wird. Das Erstellen von Ressourcen und das Definieren Ihres Verhaltens ist der erste Schritt beim Programmieren Ihrer Anwendung. Dieses Handbuch behandelt grundlegende Themen zum Auswählen der Ressourcen, die für Ihre Anwendung erforderlich sind.

Identifizieren von Pipeline Stufen, die Ressourcen benötigen

Der erste Schritt besteht darin, die Pipeline Phase (oder die Stufen) auszuwählen, die eine Ressource verwenden werden. Das heißt, jede Phase, mit der Daten aus einer Ressource gelesen werden, sowie die Phasen, die Daten in eine Ressource schreiben, werden identifiziert. Wenn Sie die Pipeline Stufen kennen, in denen die Ressourcen verwendet werden, bestimmt die APIs, die aufgerufen werden, um die Ressource an die Stufe zu binden.

In dieser Tabelle sind die Ressourcentypen aufgeführt, die an die einzelnen Pipeline Stufen gebunden werden können. Er gibt an, ob die Ressource als Eingabe oder Ausgabe sowie als Bindungs-API gebunden werden kann.

Pipeline Phase Ein/Aus Resource Ressourcentyp Bindungs-API
Eingabe-Assembler In Vertex-Puffer Buffer IASetVertexBuffers
Eingabe-Assembler In Indexpuffer Buffer IASetIndexBuffer
Shaderphasen In Shader-ResourceView Buffer, Texture1D, Texture2D, Texture3D Vssetshaderresources, gssetshaderresources, pssetshaderresources
Shaderphasen In Shader-Constant Puffer Buffer Vssetconstantbuffers, gssetconstantbuffers, pssetconstantbuffers
Streamausgabe aus Buffer Buffer SOSetTargets
Ausgabezusammenführung aus Renderzielansicht Buffer, Texture1D, Texture2D, Texture3D OMSetRenderTargets
Ausgabezusammenführung aus Ansicht "Tiefe/Schablone" Texture1D, Texture2D OMSetRenderTargets

Ermitteln, wie die einzelnen Ressourcen verwendet werden

Nachdem Sie die Pipeline Stufen ausgewählt haben, die von der Anwendung verwendet werden (und damit die Ressourcen, die in den einzelnen Phasen benötigt werden), besteht der nächste Schritt darin, zu bestimmen, wie die einzelnen Ressourcen verwendet werden sollen, d. h. ob die CPU oder die GPU auf eine Ressource zugreifen kann.

Die Hardware, auf der Ihre Anwendung ausgeführt wird, hat mindestens mindestens eine CPU und eine GPU. Um einen Verwendungs Wert auszuwählen, berücksichtigen Sie den Prozessortyp, der von den folgenden Optionen gelesen oder in die Ressource geschrieben werden muss (siehe d3d10 _ Usage).

Resource Usage Kann aktualisiert werden von Aktualisierungshäufigkeit
Standard GPU selten
Dynamisch CPU wieder
Staging GPU
Unveränderlich CPU (nur zum Zeitpunkt der Erstellung der Ressource)

Die Standardverwendung sollte für eine Ressource verwendet werden, bei der erwartet wird, dass Sie von der CPU seltener aktualisiert wird (weniger als einmal pro Frame). Im Idealfall würde die CPU niemals direkt in eine Ressource mit Standardverwendung schreiben, um potenzielle Leistungseinbußen zu vermeiden.

Dynamische Verwendung sollte für eine Ressource verwendet werden, die die CPU relativ häufig (einmal oder mehr pro Frame) aktualisiert. Ein typisches Szenario für eine dynamische Ressource besteht darin, dynamische Vertex-und Index Puffer zu erstellen, die zur Laufzeit mit Daten über die Geometrie aufgefüllt werden, die aus der Sicht des Benutzers für jeden Frame sichtbar sind. Diese Puffer werden verwendet, um nur die Geometrie zu erzeugen, die für den Benutzer für diesen Frame sichtbar ist.

Die Verwendung von Staging sollte zum Kopieren von Daten in und aus anderen Ressourcen verwendet werden. Ein typisches Szenario ist das Kopieren von Daten in eine Ressource mit der Standard Auslastung (auf die die CPU nicht zugreifen kann) auf eine Ressource mit der stagingverwendung (auf die die CPU zugreifen kann).

Unveränderliche Ressourcen sollten verwendet werden, wenn sich die Daten in der Ressource nie ändern.

Eine andere Möglichkeit, dieselbe Idee zu betrachten, besteht darin, zu überprüfen, was eine Anwendung mit einer Ressource bewirkt.

Verwendung der Ressource durch die Anwendung Resource Usage
Einmal laden und nie aktualisieren Unveränderlich oder Standard
Anwendung füllt Ressourcen wiederholt Dynamisch
In Textur Rendering Standard
CPU-Zugriff auf GPU-Daten Staging

Wenn Sie nicht sicher sind, welche Verwendung Sie auswählen, sollten Sie mit der standardmäßigen Verwendung beginnen, da es sich um den gängigsten Fall handelt. Ein Shader-Constant Puffer ist der einzige Ressourcentyp, der immer die Standardverwendung aufweisen sollte.

Binden von Ressourcen an Pipeline Stufen

Eine Ressource kann gleichzeitig an mehrere Pipeline Phasen gebunden werden, solange die beim Erstellen der Ressource angegebenen Einschränkungen (nutzungsflags, Bindungsflags, CPU-Zugriffsflags) erfüllt sind. Genauer gesagt kann eine Ressource als Eingabe und als Ausgabe gleichzeitig gebunden werden, solange das Lesen und Schreiben eines Teils einer Ressource nicht gleichzeitig erfolgen kann.

Beim Binden einer Ressource sollten Sie sich Gedanken darüber machen, wie die GPU und die CPU auf die Ressource zugreifen. Ressourcen, die für einen einzigen Zweck entwickelt wurden (verwenden Sie nicht mehrere Nutzungs-, Bindungs-und CPU-Zugriffsflags), führen zu einer besseren Leistung.

Nehmen Sie beispielsweise an, dass die Groß-/Kleinschreibung eines Renderziels mehrmals verwendet wird. Es kann schneller sein, dass zwei Ressourcen vorhanden sind: ein Renderziel und eine Textur, die als Shaderressource verwendet wird. Jede Ressource verwendet nur ein Bindungsflag (d3d10 _ Bind _ - _ Renderziel oder d3d10 _ Bind- _ Shader- _ Ressource). Die Daten werden mithilfe von copyresource oder copysubresourceregionaus der renderzieltextur in die Shader-Textur kopiert. Dies kann die Leistung verbessern, indem der Renderziel-Schreibvorgang aus dem Shader-Texture-Lesevorgang isoliert wird. Natürlich ist die einzige Möglichkeit, beide Ansätze zu implementieren und den Leistungsunterschied in ihrer jeweiligen Anwendung zu messen.

Ressourcen (Direct3D 10)