Auswählen einer Ressource (Direct3D 10)
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 Leitfaden werden grundlegende Themen für die Auswahl der ressourcen behandelt, die für Ihre Anwendung erforderlich sind.
- Identifizieren von Pipelinephasen, die Ressourcen benötigen
- Identifizieren, wie die einzelnen Ressourcen verwendet werden
- Binden von Ressourcen an Pipelinephasen
- Zugehörige Themen
Identifizieren von Pipelinephasen, die Ressourcen benötigen
Der erste Schritt besteht darin, die Pipelinephase (oder -phasen) auszuwählen, in der eine Ressource verwendet wird. Das heißt, identifizieren Sie jede Phase, die Daten aus einer Ressource liest, sowie die Phasen, die Daten in eine Ressource schreiben. Die Kenntnis der Pipelinephasen, in denen die Ressourcen verwendet werden, bestimmt die APIs, die aufgerufen werden, um die Ressource an die Phase zu binden.
In dieser Tabelle sind die Ressourcentypen aufgeführt, die an jede Pipelinephase gebunden werden können. Sie enthält, ob die Ressource als Eingabe oder Ausgabe gebunden werden kann, sowie die Bindungs-API.
Pipelinephase | Ein/Aus | Resource | Ressourcentyp | Bindungs-API |
---|---|---|---|---|
Eingabe-Assembler | In | Vertexpuffer | 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 | Tiefen-/Schablonenansicht | Texture1D, Texture2D | OMSetRenderTargets |
Identifizieren, wie die einzelnen Ressourcen verwendet werden
Nachdem Sie die Pipelinephasen ausgewählt haben, die Ihre Anwendung verwenden soll (und damit die Ressourcen, die für jede Phase erforderlich sind), besteht der nächste Schritt darin, zu bestimmen, wie die einzelnen Ressourcen verwendet werden, d. h. ob die CPU oder die GPU auf eine Ressource zugreifen kann.
Die Hardware, auf der Ihre Anwendung ausgeführt wird, verfügt über mindestens eine CPU und eine GPU. Wenn Sie einen Nutzungswert auswählen möchten, überlegen Sie, welcher Prozessortyp die Ressource aus den folgenden Optionen lesen oder schreiben muss (siehe D3D10_USAGE).
Resource Usage | Kann aktualisiert werden von | Häufigkeit der Aktualisierung |
---|---|---|
Standard | GPU | Selten |
Dynamisch | CPU | Häufig |
Staging | GPU | – |
Unveränderlich | CPU (nur zum Zeitpunkt der Ressourcenerstellung) | – |
Die Standardnutzung sollte für eine Ressource verwendet werden, von der erwartet wird, dass sie von der CPU selten aktualisiert wird (weniger als einmal pro Frame). Im Idealfall schreibt die CPU nie direkt in eine Ressource mit Standardauslastung, um potenzielle Leistungseinbußen zu vermeiden.
Die dynamische Nutzung sollte für eine Ressource verwendet werden, die von der CPU relativ häufig aktualisiert wird (einmal oder mehr pro Frame). Ein typisches Szenario für eine dynamische Ressource wäre die Erstellung dynamischer Vertex- und Indexpuffer, die zur Laufzeit mit Daten zur Geometrie gefüllt werden, die aus Sicht des Benutzers für jeden Frame sichtbar sind. Diese Puffer würden verwendet, um nur die Geometrie zu rendern, die für den Benutzer für diesen Frame 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 Standardnutzung (auf die die CPU nicht zugreifen kann) in eine Ressource mit Stagingauslastung (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, die gleiche Idee zu betrachten, besteht darin, sich gedanken zu machen, was eine Anwendung mit einer Ressource macht.
Verwendung der Ressource durch die Anwendung | Resource Usage |
---|---|
Einmal laden und nie aktualisieren | Unveränderlich oder Standard |
Die Anwendung füllt die Ressource wiederholt aus. | Dynamisch |
Rendern in Textur | Standard |
CPU-Zugriff auf GPU-Daten | Staging |
Wenn Sie sich nicht sicher sind, welche Verwendung Sie auswählen sollen, beginnen Sie mit der Standardverwendung, da dies der häufigste Fall sein wird. Ein Shader-Constant Puffer ist der einzige Ressourcentyp, der immer standardmäßig verwendet werden sollte.
Binden von Ressourcen an Pipelinephasen
Eine Ressource kann gleichzeitig an mehrere Pipelinephasen gebunden werden, solange die beim Erstellen der Ressource angegebenen Einschränkungen (Verwendungsflags, Bindungsflags, CPU-Zugriffsflags) erfüllt sind. Genauer gesagt kann eine Ressource gleichzeitig als Eingabe und 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 einzigen Zweck konzipiert sind (verwenden keine Mehrfachnutzungs-, Bindungs- und CPU-Zugriffsflags), führen mehr als wahrscheinlich zu einer besseren Leistung.
Betrachten Sie beispielsweise den Fall eines Renderziels, das mehrmals als Textur verwendet wird. Es kann schneller sein, über zwei Ressourcen zu verfügen: ein Renderziel und eine Textur, die als Shaderressource verwendet wird. Jede Ressource würde nur ein Bindungsflag (D3D10_BIND_RENDER_TARGET oder D3D10_BIND_SHADER_RESOURCE) verwenden. Die Daten würden mithilfe von CopyResource oder CopySubresourceRegion aus der Renderzieltextur in die Shadertextur kopiert. Dies kann die Leistung verbessern, indem der Render-Zielschreibvorgang aus dem Shadertexttext gelesen wird. Natürlich können Sie sicher sein, dass Sie beide Ansätze implementieren und den Leistungsunterschied in Ihrer jeweiligen Anwendung messen.
Zugehörige Themen