Auswählen einer Ressource
Eine Ressource ist eine Sammlung von Daten, die von der 3D-Pipeline verwendet werden. Das Erstellen von Ressourcen und das Definieren ihres Verhaltens ist der erste Schritt zur Programmierung Ihrer Anwendung. In diesem Handbuch werden grundlegende Themen zum Auswählen der ressourcen behandelt, die von Ihrer Anwendung benötigt werden.
Identifizieren von Pipelinephasen, die Ressourcen benötigen
Der erste Schritt besteht darin, die Grafikpipelinephase (oder -stufen) auszuwählen, die eine Ressource verwendet. Das heißt, identifizieren Sie jede Phase, in der Daten aus einer Ressource gelesen werden, sowie die Phasen, in die Daten in eine Ressource geschrieben werden. Wenn Sie die Pipelinephasen kennen, in denen die Ressourcen verwendet werden, werden die APIs bestimmt, die aufgerufen werden, um die Ressource an die Phase zu binden.
In dieser Tabelle sind die Ressourcentypen aufgeführt, die an jede Pipelinestufe gebunden werden können. Sie enthält, ob die Ressource als Eingabe oder Ausgabe gebunden werden kann.
Pipelinephase | Ein/Aus | Resource | Ressourcentyp |
---|---|---|---|
Eingabe-Assembler | In | Vertexpuffer | Buffer |
Eingabe-Assembler | In | Indexpuffer | Buffer |
Shaderstufen | In | Shader-ResourceView | Puffer, Texture1D, Texture2D, Texture3D |
Shaderstufen | In | Shaderkonstantenpuffer | Buffer |
Streamausgabe | aus | Buffer | Buffer |
Ausgabezusammenführung | aus | Renderzielansicht | Puffer, Texture1D, Texture2D, Texture3D |
Ausgabezusammenführung | aus | Tiefen-/Schablonenansicht | Texture1D, Texture2D |
Ermitteln, wie jede Ressource verwendet wird
Nachdem Sie die Pipelinephasen ausgewählt haben, die ihre Anwendung verwendet (und daher die Ressourcen, die jede Stufe benötigt), besteht der nächste Schritt darin, zu bestimmen, wie jede Ressource verwendet wird, d. h., ob von der CPU oder der GPU auf eine Ressource zugegriffen werden kann.
Die Hardware, auf der Ihre Anwendung ausgeführt wird, weist mindestens eine CPU und eine GPU auf. Um einen Verwendungswert auszuwählen, überlegen Sie, welcher Prozessortyp aus den folgenden Optionen in die Ressource gelesen oder in die Ressource geschrieben werden muss.
Resource Usage | Kann aktualisiert werden von | Häufigkeit der Aktualisierung |
---|---|---|
Standard | GPU | selten |
Dynamisch | CPU | (regelmäßig) |
Staging | GPU | Nicht zutreffend |
Unveränderlich | CPU (nur zur Ressourcenerstellungszeit) | Nicht zutreffend |
Die Standardverwendung sollte für eine Ressource verwendet werden, die von der CPU selten aktualisiert wird (weniger als einmal pro Frame). Im Idealfall würde die CPU niemals direkt in eine Ressource mit Standardauslastung schreiben, um potenzielle Leistungseinbußen zu vermeiden.
Die dynamische Verwendung sollte für eine Ressource verwendet werden, die die CPU relativ häufig aktualisiert (einmal oder mehr pro Frame). Ein typisches Szenario für eine dynamische Ressource wäre das Erstellen dynamischer Vertex- und Indexpuffer, die zur Laufzeit mit Daten über die Geometrie gefüllt würden, die aus sicht des Benutzers für jeden Frame sichtbar wäre. Diese Puffer würden verwendet, um nur die Geometrie für diesen Frame zu rendern, die für den Benutzer sichtbar ist.
Die Stagingverwendung sollte verwendet werden, um Daten in und aus anderen Ressourcen zu kopieren. Ein typisches Szenario wäre das Kopieren von Daten in einer Ressource mit Standardauslastung (auf die die CPU nicht zugreifen kann) auf eine Ressource mit Stagingnutzung (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, sich die gleiche Idee anzusehen, besteht darin, zu überlegen, was eine Anwendung mit einer Ressource tut.
Verwendung der Ressource durch Anwendung | Resource Usage |
---|---|
Einmal laden und nie aktualisieren | Unveränderlich oder Standard |
Die Anwendung füllt die Ressource wiederholt aus. | Dynamisch |
Render to texture | Standard |
CPU-Zugriff auf GPU-Daten | Staging |
Wenn Sie nicht sicher sind, welche Verwendung Sie auswählen möchten, beginnen Sie mit der Standardverwendung, wie erwartet, dass sie der häufigste Fall ist. Ein Shaderkonstantenpuffer ist der einzige Ressourcentyp, der immer die Standardverwendung aufweisen sollte.
Binden von Ressourcen an Pipelinephasen
Eine Ressource kann gleichzeitig an mehrere Pipelinephasen gebunden werden, solange die beim Erstellen der Ressource angegebenen Einschränkungen erfüllt sind. Diese Einschränkungen werden als Verwendungskennzeichnungen, Bindungskennzeichnungen oder CPU-Zugriffsflags angegeben. Genauer gesagt kann eine Ressource als Eingabe und gleichzeitige Ausgabe gebunden werden, solange das Lesen und Schreiben eines Teils einer Ressource nicht gleichzeitig erfolgen kann.
Überlegen Sie beim Binden einer Ressource, wie die GPU und die CPU auf die Ressource zugreifen. Ressourcen, die für einen einzelnen Zweck konzipiert sind (nicht mehrere Verwendungs-, Bindungs- und CPU-Zugriffsflags verwenden), führen zu einer besseren Leistung.
Betrachten Sie z. B. den Fall eines Renderziels, das mehrmals als Textur verwendet wird. Es kann schneller sein, zwei Ressourcen zu haben: ein Renderziel und eine Textur, die als Shaderressource verwendet wird. Jede Ressource würde nur ein Bindungsflagge verwenden, das "Renderziel" oder "Shaderressource" angibt. Die Daten würden aus der Renderzieltextur in die Shadertextur kopiert.
Diese Technik in diesem Beispiel kann die Leistung verbessern, indem der Renderziel-Schreibvorgang aus dem Shadertext gelesen wird. Die einzige Möglichkeit, sicherzustellen, besteht darin, sowohl Ansätze zu implementieren als auch den Leistungsunterschied in Ihrer jeweiligen Anwendung zu messen.
Verwandte Themen