D3D11_USAGE-Enumeration (d3d11.h)

Identifiziert die erwartete Ressourcennutzung während des Renderings. Die Nutzung spiegelt direkt wider, ob die CPU und/oder die Grafikverarbeitungseinheit (GPU) auf eine Ressource zugreifen kann.

Syntax

typedef enum D3D11_USAGE {
  D3D11_USAGE_DEFAULT = 0,
  D3D11_USAGE_IMMUTABLE = 1,
  D3D11_USAGE_DYNAMIC = 2,
  D3D11_USAGE_STAGING = 3
} ;

Konstanten

 
D3D11_USAGE_DEFAULT
Wert: 0
Eine Ressource, die Lese- und Schreibzugriff durch die GPU erfordert. Dies ist wahrscheinlich die am häufigsten verwendete Wahl.
D3D11_USAGE_IMMUTABLE
Wert: 1
Eine Ressource, die nur von der GPU gelesen werden kann. Es kann nicht von der GPU geschrieben werden, und die CPU kann überhaupt nicht darauf zugreifen. Dieser Ressourcentyp muss beim Erstellen initialisiert werden, da er nach der Erstellung nicht mehr geändert werden kann.
D3D11_USAGE_DYNAMIC
Wert: 2
Eine Ressource, auf die sowohl die GPU (schreibgeschützt) als auch die CPU (schreibgeschützt) zugreifen kann. Eine dynamische Ressource ist eine gute Wahl für eine Ressource, die von der CPU mindestens einmal pro Frame aktualisiert wird. Verwenden Sie zum Aktualisieren einer dynamischen Ressource eine Map-Methode .

Informationen zur Verwendung dynamischer Ressourcen finden Sie unter Vorgehensweise: Verwenden dynamischer Ressourcen.
D3D11_USAGE_STAGING
Wert: 3
Eine Ressource, die die Datenübertragung (Kopieren) von der GPU an die CPU unterstützt.

Hinweise

Eine Anwendung gibt in einer Ressourcenbeschreibung an, wie eine Ressource verwendet werden soll (ihre Verwendung). Es gibt mehrere Strukturen zum Erstellen von Ressourcen: D3D11_TEXTURE1D_DESC, D3D11_TEXTURE2D_DESC, D3D11_TEXTURE3D_DESC und D3D11_BUFFER_DESC.

Unterschiede zwischen Direct3D 9 und Direct3D 10/11:

In Direct3D 9 geben Sie den Typ des Arbeitsspeichers an, in dem eine Ressource zur Zeit der Ressourcenerstellung (mithilfe von D3DPOOL) erstellt werden soll. Es war die Aufgabe einer Anwendung, zu entscheiden, welcher Speicherpool die beste Kombination aus Funktionalität und Leistung bietet.

In Direct3D 10/11 gibt eine Anwendung nicht mehr an, in welchem Arbeitsspeichertyp (dem Pool) eine Ressource erstellt werden soll. Stattdessen geben Sie die beabsichtigte Verwendung der Ressource an und lassen die Runtime (in Zusammenarbeit mit dem Treiber und einem Speicher-Manager) den Speichertyp auswählen, der die beste Leistung erzielt.

 

Ressourcennutzungseinschränkungen

Jede Nutzung diktiert einen Kompromiss zwischen der Barrierefreiheit für die CPU und der Barrierefreiheit für die GPU. Im Allgemeinen bedeutet der Zugriff mit höherer Leistung für einen dieser beiden Prozessoren den Zugriff für den anderen. Bei beiden Extrembedingungen sind die D3D11_USAGE_DEFAULT - und D3D11_USAGE_STAGING-Nutzungen . D3D11_USAGE_DEFAULT beschränkt den Zugriff fast vollständig auf die GPU. D3D11_USAGE_STAGING beschränkt den Zugriff fast vollständig auf die CPU und lässt nur eine Datenübertragung (Kopie) einer Ressource zwischen gpu und CPU zu. Sie können diese Kopiervorgänge über die Methoden ID3D11DeviceContext::CopySubresourceRegion und ID3D11DeviceContext::CopyResource ausführen. Sie können diese Kopiermethoden auch verwenden, um Daten zwischen zwei Ressourcen derselben Verwendung zu kopieren. Sie können auch die ID3D11DeviceContext::UpdateSubresource-Methode verwenden, um Arbeitsspeicher direkt aus einem CPU-bereitgestellten Zeiger auf eine beliebige Ressource zu kopieren, am nützlichsten eine Ressource mit D3D11_USAGE_DEFAULT.

D3D11_USAGE_DYNAMIC Nutzung ist ein Sonderfall, der den Datenfluss von der CPU zur GPU optimiert, wenn die CPU diese Daten on-the-fly generiert und diese Daten mit hoher Häufigkeit sendet. D3D11_USAGE_DYNAMIC wird in der Regel für Ressourcen mit Scheitelpunktdaten und konstanten Puffern verwendet. Verwenden Sie die Methoden ID3D11DeviceContext::Map und ID3D11DeviceContext::Unmap , um Daten in diese Ressourcen zu schreiben. Verwenden Sie die D3D11_MAP_WRITE_NO_OVERWRITE - und D3D11_MAP_WRITE_DISCARD Sequenz, um die höchste Leistung für serielle Daten wie Vertexdaten zu erzielen. Weitere Informationen zu dieser Sequenz finden Sie unter Allgemeine Verwendung von D3D11_MAP_WRITE_DISCARD mit D3D11_MAP_WRITE_NO_OVERWRITE.

D3D11_USAGE_IMMUTABLE Verwendung ist ein weiterer Sonderfall, der dazu führt, dass die GPU daten nur einmal generiert, wenn Sie eine Ressource erstellen. D3D11_USAGE_IMMUTABLE eignet sich gut für Daten wie Texturen, da diese Daten in der Regel aus einem Dateiformat in den Arbeitsspeicher eingelesen werden. Wenn Sie also eine Textur mit D3D11_USAGE_IMMUTABLE erstellen, liest die GPU diese Textur direkt in den Arbeitsspeicher ein.

Verwenden Sie die folgende Tabelle, um die Verwendung auszuwählen, die am besten beschreibt, wie die CPU und/oder die GPU auf die Ressource zugreifen muss. Natürlich gibt es Leistungseinbußen.

Resource Usage Standard Dynamisch Unveränderlich Staging
GPU-Read ja ja ja ja¹
GPU-Write ja ja¹
CPU-Read ja¹
CPU-Write ja ja¹
 

1 : Gpu-Lese- oder Schreibvorgänge einer Ressource mit der D3D11_USAGE_STAGING Nutzung sind auf Kopiervorgänge beschränkt. Für diese Kopiervorgänge verwenden Sie ID3D11DeviceContext::CopySubresourceRegion und ID3D11DeviceContext::CopyResource . Da Tiefenschablonenformate und Multisampellayouts Implementierungsdetails eines bestimmten GPU-Designs sind, kann das Betriebssystem diese Formate und Layouts nicht allgemein für die CPU verfügbar machen. Daher können Stagingressourcen kein Tiefenschablonenpuffer oder mehrsampiges Renderziel sein.

Hinweis Sie können ID3D11DeviceContext::UpdateSubresource technisch verwenden, um in eine Ressource mit beliebiger Verwendung mit Ausnahme D3D11_USAGE_IMMUTABLE zu kopieren. Es wird jedoch empfohlen, ID3D11DeviceContext::UpdateSubresource zu verwenden, um nur eine Ressource mit D3D11_USAGE_DEFAULT zu aktualisieren. Es wird empfohlen, ID3D11DeviceContext::Map und ID3D11DeviceContext::Unmap zu verwenden, um Ressourcen mit D3D11_USAGE_DYNAMIC zu aktualisieren, da dies der spezifische Zweck von D3D11_USAGE_DYNAMIC Ressourcen ist und daher der am besten optimierte Pfad ist.
 
Beachten SieD3D11_USAGE_DYNAMIC Ressourcen bestimmte Hardwarefunktionen nutzen. Verwenden Sie sie daher sparsam. Der Anzeigetreiber weist in der Regel Arbeitsspeicher für D3D11_USAGE_DYNAMIC Ressourcen mit einem Zwischenspeicherungsalgorithmus zu, der CPU-Schreibvorgänge bevorzugt und CPU-Lesevorgänge verhindert. Darüber hinaus ist der Arbeitsspeicher hinter D3D11_USAGE_DYNAMIC Ressourcen möglicherweise nicht einmal derselbe für aufeinander folgende Aufrufe von ID3D11DeviceContext::Map. Erwarten Sie daher keine hohe Leistung oder sogar konsistente CPU-Lesevorgänge aus D3D11_USAGE_DYNAMIC Ressourcen.
 
HinweisID3D11DeviceContext::CopyStructureCount ist ein Sonderfall der GPU-zu-CPU-Kopie. Verwenden Sie ID3D11DeviceContext::CopyStructureCount nur mit ungeordneten Zugriffssichten (UAVs) von Puffern.
 

Ressourcenbindungsoptionen

Um die Leistung zu maximieren, können nicht alle Ressourcennutzungsoptionen als Eingabe- oder Ausgaberessourcen für die Pipeline verwendet werden. In dieser Tabelle werden diese Einschränkungen beschrieben.
Ressource kann als gebunden werden Standard Dynamisch Unveränderlich Staging
Eingabe in eine Phase ja² ja³ ja
Ausgabe aus einer Phase ja²
 
  • 2 : Wenn sie als Eingabe und Ausgabe mit unterschiedlichen Ansichten gebunden ist, muss jede Ansicht unterschiedliche Unterressourcen verwenden.
  • 3 : Die Ressource kann nur mit einer einzelnen Unterressource erstellt werden. Die Ressource darf kein Texturarray sein. Die Ressource darf keine mipmap-Kette sein.

Anforderungen

Anforderung Wert
Header d3d11.h

Weitere Informationen

Ressourcenaufzählungen