Auswählen einer RessourceChoosing a resource

Eine Ressource ist eine Sammlung von Daten, die von der 3D-Pipeline verwendet wird.A resource is a collection of data that is used by the 3D pipeline. Das Erstellen von Ressourcen und das Definieren Ihres Verhaltens ist der erste Schritt beim Programmieren Ihrer Anwendung.Creating resources and defining their behavior is the first step toward programming your application. Dieses Handbuch behandelt grundlegende Themen zum Auswählen der Ressourcen, die für Ihre Anwendung erforderlich sind.This guide covers basic topics for choosing the resources required by your application.

Identifizieren von Pipeline Stufen, die Ressourcen benötigenIdentify pipeline stages that need resources

Der erste Schritt besteht darin, die Grafik Pipeline Stufe (oder die Stufen) auszuwählen, die eine Ressource verwenden werden.The first step is to choose the graphics pipeline stage (or stages) that will use a resource. Das heißt, jede Phase, mit der Daten aus einer Ressource gelesen werden, sowie die Phasen, die Daten in eine Ressource schreiben, werden identifiziert.That is, identify each stage that will read data from a resource as well as the stages that will write data out to a resource. 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.Knowing the pipeline stages where the resources will be used determines the APIs that will be called to bind the resource to the stage.

In dieser Tabelle sind die Ressourcentypen aufgeführt, die an die einzelnen Pipeline Stufen gebunden werden können.This table lists the types of resources that can be bound to each pipeline stage. Er gibt an, ob die Ressource als Eingabe oder Ausgabe gebunden werden kann.It includes whether the resource can be bound as an input or an output.

Pipeline PhasePipeline Stage Ein/AusIn/Out RessourceResource RessourcentypResource Type
Eingabe-AssemblerInput Assembler InIn Vertex-PufferVertex Buffer BufferBuffer
Eingabe-AssemblerInput Assembler InIn IndexpufferIndex Buffer BufferBuffer
ShaderphasenShader Stages InIn Shader-resourceviewShader-ResourceView Buffer, Texture1D, Texture2D, Texture3DBuffer, Texture1D, Texture2D, Texture3D
ShaderphasenShader Stages InIn Shader-konstanter PufferShader-Constant Buffer BufferBuffer
StreamausgabeStream Output ausOut BufferBuffer BufferBuffer
AusgabezusammenführungOutput Merger ausOut RenderzielansichtRender-target View Buffer, Texture1D, Texture2D, Texture3DBuffer, Texture1D, Texture2D, Texture3D
AusgabezusammenführungOutput Merger ausOut Ansicht "Tiefe/Schablone"Depth/Stencil View Texture1D, Texture2DTexture1D, Texture2D

 

Ermitteln, wie die einzelnen Ressourcen verwendet werdenIdentify how each resource will be used

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.Once you have chosen the pipeline stages that your application will use (and therefore the resources that each stage will require), the next step is to determine how each resource will be used, that is, whether a resource can be accessed by the CPU or the GPU.

Die Hardware, auf der Ihre Anwendung ausgeführt wird, hat mindestens mindestens eine CPU und eine GPU.The hardware that your application is running on will have a minimum of at least one CPU and one 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.To pick a usage value, consider which type of processor needs to read or write to the resource from the following options.

Resource UsageResource Usage Kann aktualisiert werden vonCan be updated by AktualisierungshäufigkeitFrequency of Update
StandardDefault GPUGPU selteninfrequently
DynamischDynamic CPUCPU wiederfrequently
StagingStaging GPUGPU n/a
UnveränderlichImmutable CPU (nur zum Zeitpunkt der Erstellung der Ressource)CPU (only at resource creation time) n/a

 

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).Default usage should be used for a resource that is expected to be updated by the CPU infrequently (less than once per frame). Im Idealfall würde die CPU niemals direkt in eine Ressource mit Standardverwendung schreiben, um potenzielle Leistungseinbußen zu vermeiden.Ideally, the CPU would never write directly to a resource with default usage so as to avoid potential performance penalties.

Dynamische Verwendung sollte für eine Ressource verwendet werden, die die CPU relativ häufig (einmal oder mehr pro Frame) aktualisiert.Dynamic usage should be used for a resource that the CPU updates relatively frequently (once or more per frame). 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.A typical scenario for a dynamic resource would be to create dynamic vertex and index buffers that would be filled at runtime with data about the geometry visible from the point of view of the user for each frame. Diese Puffer werden verwendet, um nur die Geometrie zu erzeugen, die für den Benutzer für diesen Frame sichtbar ist.These buffers would be used to render only the geometry visible to the user for that frame.

Die Verwendung von Staging sollte zum Kopieren von Daten in und aus anderen Ressourcen verwendet werden.Staging usage should be used to copy data to and from other resources. 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).A typical scenario would be to copy data in a resource with default usage (which the CPU cannot access) to a resource with staging usage (which the CPU can access).

Unveränderliche Ressourcen sollten verwendet werden, wenn sich die Daten in der Ressource nie ändern.Immutable resources should be used when the data in the resource will never change.

Eine andere Möglichkeit, dieselbe Idee zu betrachten, besteht darin, zu überprüfen, was eine Anwendung mit einer Ressource bewirkt.Another way of looking at the same idea is to think of what an application does with a resource.

Verwendung der Ressource durch die AnwendungHow Application uses the Resource Resource UsageResource Usage
Einmal laden und nie aktualisierenLoad once and never update Unveränderlich oder StandardImmutable or Default
Anwendung füllt Ressourcen wiederholtApplication fills resource repeatedly DynamischDynamic
In Textur RenderingRender to texture StandardDefault
CPU-Zugriff auf GPU-DatenCPU access of GPU data StagingStaging

 

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.If you are unsure what usage to choose, start with the default usage as it is expected to be the most common case. Ein Shader-Constant-Puffer ist der einzige Ressourcentyp, der immer die Standardverwendung aufweisen sollte.A Shader-Constant buffer is the one resource type that should always have default usage.

Binden von Ressourcen an Pipeline StufenBinding resources to pipeline stages

Eine Ressource kann gleichzeitig an mehrere Pipeline Phasen gebunden werden, solange die beim Erstellen der Ressource angegebenen Einschränkungen erfüllt sind.A resource can be bound to more than one pipeline stage at the same time as long as the restrictions specified when the resource was created are met. Diese Einschränkungen werden als nutzungsflags, Bindungsflags oder CPU-Zugriffsflags angegeben.These restrictions are specified as usage flags, bind flags, or cpu access flags. 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.More specifically, a resource can be bound as an input and an output simultaneously as long as reading and writing part of a resource cannot happen at the same time.

Beim Binden einer Ressource sollten Sie sich Gedanken darüber machen, wie die GPU und die CPU auf die Ressource zugreifen.When binding a resource, think about how the GPU and the CPU will access the resource. Ressourcen, die für einen einzigen Zweck entwickelt wurden (verwenden Sie nicht mehrere Nutzungs-, Bindungs-und CPU-Zugriffsflags), führen zu einer besseren Leistung.Resources that are designed for a single purpose (do not use multiple usage, bind, and cpu access flags) will more than likely result in better performance.

Nehmen Sie beispielsweise an, dass die Groß-/Kleinschreibung eines Renderziels mehrmals verwendet wird.For example, consider the case of a render target used as a texture multiple times. Es kann schneller sein, dass zwei Ressourcen vorhanden sind: ein Renderziel und eine Textur, die als Shaderressource verwendet wird.It may be faster to have two resources: a render target and a texture used as a shader resource. Jede Ressource verwendet nur ein Bindungsflag, das "Renderziel" oder "Shader-Ressource" angibt.Each resource would use only one bind flag, indicating "render target" or "shader resource". Die Daten werden aus der renderzieltextur in die Shader-Textur kopiert.The data would be copied from the render-target texture to the shader texture.

Diese Vorgehensweise in diesem Beispiel kann die Leistung verbessern, indem Sie den Renderziel-Schreibvorgang aus dem Shader-Texture-Lesevorgang isolieren.This technique in this example may improve performance by isolating the render-target write from the shader-texture read. Die einzige Möglichkeit besteht darin, beide Ansätze zu implementieren und den Leistungsunterschied in ihrer jeweiligen Anwendung zu messen.The only way to be sure is to implement both approaches and measure the performance difference in your particular application.

Verwandte ThemenRelated topics

RessourcenResources