D3D11_USAGE列舉 (d3d11.h)

識別轉譯期間的預期資源使用。 使用量會直接反映 CPU 和 /或圖形處理器 (GPU) 存取資源。

Syntax

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

常數

 
D3D11_USAGE_DEFAULT
值: 0
需要 GPU 讀取和寫入存取權的資源。 這可能是最常見的使用方式選擇。
D3D11_USAGE_IMMUTABLE
值: 1
只能由 GPU 讀取的資源。 它無法由 GPU 寫入,而且完全無法由 CPU 存取。 建立資源時必須初始化此類型的資源,因為它無法在建立之後變更。
D3D11_USAGE_DYNAMIC
值: 2
GPU (唯讀) 和 CPU (寫入) 可存取的資源。 動態資源是每個畫面至少由CPU更新一次之資源的絕佳選擇。 若要更新動態資源,請使用 Map 方法。

如需如何使用動態資源的詳細資訊,請參閱 如何:使用動態資源
D3D11_USAGE_STAGING
值: 3
支援從 GPU 將) 複製到 CPU (資料傳輸的資源。

備註

應用程式會識別資源在資源描述中用來 (其使用量) 的方式。 建立資源有數個結構,包括: D3D11_TEXTURE1D_DESCD3D11_TEXTURE2D_DESCD3D11_TEXTURE3D_DESCD3D11_BUFFER_DESC

Direct3D 9 與 Direct3D 10/11 之間的差異:

在 Direct3D 9 中,您會使用 D3DPOOL) ,指定資源在資源建立時間 (應建立的記憶體類型。 這是應用程式的工作,可決定哪些記憶體集區可提供最佳功能與效能組合。

在 Direct3D 10/11 中,應用程式不再指定集區 () 建立資源的記憶體類型。 相反地,您可以指定資源的預期使用量,並讓運行時間與驅動程式和記憶體管理員一起 () 選擇可達到最佳效能的記憶體類型。

 

資源使用限制

每個使用量都會決定 CPU 的輔助功能與 GPU 輔助功能之間的取捨。 一般而言,這兩個處理器其中一個的效能較高存取表示另一個處理器的效能較低。 其中一個極端是 D3D11_USAGE_DEFAULTD3D11_USAGE_STAGING 用法。 D3D11_USAGE_DEFAULT 幾乎會限制對 GPU 的存取。 D3D11_USAGE_STAGING 幾乎會限制對 CPU 的存取,並只允許在 GPU 與 CPU 之間複製資源) (資料傳輸。 您可以透過 ID3D11DeviceContext::CopySubresourceRegionID3D11DeviceContext::CopyResource 方法來執行這些複製作業。 您也可以使用這些複製方法,在相同使用量的兩個資源之間複製數據。 您也可以使用 ID3D11DeviceContext::UpdateSubresource 方法,直接從CPU提供的指標將記憶體複製到任何資源,最有用的是具有 D3D11_USAGE_DEFAULT的資源。

D3D11_USAGE_DYNAMIC 使用量是一種特殊案例,可在 CPU 產生實時數據並傳送高頻率的數據時,將 CPU 到 GPU 的數據流程優化。 D3D11_USAGE_DYNAMIC 通常用於具有頂點數據和常數緩衝區的資源。 使用 ID3D11DeviceContext::MapID3D11DeviceContext::Unmap 方法,將數據寫入這些資源。 若要達到序列取用數據的最高效能,例如頂點數據,請使用 D3D11_MAP_WRITE_NO_OVERWRITED3D11_MAP_WRITE_DISCARD 序列。 如需此順序的詳細資訊,請參閱 搭配D3D11_MAP_WRITE_NO_OVERWRITE D3D11_MAP_WRITE_DISCARD的常見用法

D3D11_USAGE_IMMUTABLE 使用量是另一個特殊案例,會導致 GPU 在建立資源時只產生一次數據。 D3D11_USAGE_IMMUTABLE 非常適合紋理之類的數據,因為這類數據通常是從某些檔格式讀入記憶體中。 因此,當您使用 D3D11_USAGE_IMMUTABLE 建立紋理時,GPU 會將該紋理直接讀入記憶體中。

使用下表來選擇最能描述 CPU 和/或 GPU 需要如何存取資源的使用量。 當然,會有效能取捨。

資源使用狀況 Default 動態 固定 預備
GPU-Read 是¹
GPU-Write 是¹
CPU-Read 是¹
CPU-Write 是¹
 

1 - GPU 讀取或寫入具有 D3D11_USAGE_STAGING 使用量的資源僅限於複製作業。 您可以使用 ID3D11DeviceContext::CopySubresourceRegionID3D11DeviceContext::CopyResource 來進行這些複製作業。 此外,因為深度樣板格式和多重取樣配置是特定 GPU 設計的實作詳細數據,所以操作系統通常無法將這些格式和配置公開給 CPU。 因此,預備資源不能是深度樣板緩衝區或多重取樣轉譯目標。

注意技術上可以使用ID3D11DeviceContext::UpdateSubresource 來複製到資源,但D3D11_USAGE_IMMUTABLE除外。 不過,我們建議使用 ID3D11DeviceContext::UpdateSubresource 僅更新具有 D3D11_USAGE_DEFAULT的資源。 建議您使用 ID3D11DeviceContext::MapID3D11DeviceContext::Unmap ,以 D3D11_USAGE_DYNAMIC 更新資源,因為這是 D3D11_USAGE_DYNAMIC 資源的特定用途,因此是最優化的路徑。
 
請注意D3D11_USAGE_DYNAMIC 資源會耗用特定的硬體功能。 因此,請謹慎使用它們。 顯示驅動程式通常會使用偏好 CPU 寫入和阻礙 CPU 讀取的快取演算法,為 D3D11_USAGE_DYNAMIC 資源配置記憶體。 此外,對ID3D11DeviceContext::Map的後續呼叫D3D11_USAGE_DYNAMIC資源背後的記憶體可能不相同。 因此,請勿預期會從 D3D11_USAGE_DYNAMIC 資源讀取高效能或甚至一致的 CPU 讀取。
 
注意ID3D11DeviceContext::CopyStructureCount 是 GPU 對 CPU 複製的特殊案例。 僅搭配未排序存取檢視使用 ID3D11DeviceContext::CopyStructureCount , (UAV) 緩衝區。
 

資源系結選項

若要將效能最大化,並非所有資源使用選項都可以當做管線的輸入或輸出資源使用。 下表會識別這些限制。
資源可以系結為 Default 動態 固定 預備
階段的輸入 是,是 是,是
階段的輸出 是,是
 
  • 2 - 如果使用不同檢視系結為輸入和輸出,則每個檢視都必須使用不同的子資源。
  • 3 - 只能使用單一子資源來建立資源。 資源不能是紋理陣列。 資源不能是Mipmap鏈結。

規格需求

需求
標頭 d3d11.h

另請參閱

資源列舉