Direct3D 11 中的裝置簡介

Direct3D 11 物件模型會將資源建立和轉譯功能分成裝置和一或多個內容;此分隔的設計目的是為了加速多執行緒。

裝置

裝置可用來建立資源,並列舉顯示器配接器的功能。 在 Direct3D 11 中,裝置會以 ID3D11Device 介面來表示。

每個應用程式必須至少有一個裝置,大部分的應用程式只能建立一個裝置。 呼叫 D3D11CreateDeviceD3D11CreateDeviceAndSwapChain ,並使用 D3D_DRIVER_TYPE 旗標指定驅動程式類型,為電腦上安裝的其中一個硬體驅動程式建立裝置。 每個裝置可以使用一或多個裝置內容,視所需的功能而定。

裝置內容

裝置內容包含使用裝置的情況或設定。 更具體來說,裝置內容是用來設定管線狀態,並使用裝置所擁有的資源產生轉譯命令。 Direct3D 11 實作兩種類型的裝置內容,一種用於立即轉譯,另一種用於延後轉譯;這兩個內容都以 ID3D11DeviceCoNtext 介面表示。

即時內容

立即內容會直接轉譯至驅動程式。 每個裝置都有一個且只有一個即時內容,可以從 GPU 擷取資料。 即時內容可用來立即轉譯 (或) 命令清單播放。

有兩種方式可取得立即內容:

延後內容

延遲的內容會將 GPU 命令記錄到 命令清單中。 延後的內容主要用於多執行緒處理,而且不需要單一線程應用程式。 背景工作執行緒通常會使用延後的內容,而不是主要轉譯執行緒。 當您建立延後的內容時,它不會從立即內容繼承任何狀態。

若要取得延後的內容,請呼叫 ID3D11Device::CreateDeferredCoNtext

只要內容一次只用于一個執行緒,就可以在任何執行緒上使用任何內容 -- 立即或延後。

執行緒考量

下表強調 Direct3D 11 中與舊版 Direct3D 的執行緒模型差異。

Direct3D 11 與舊版 Direct3D 之間的差異:
所有 ID3D11Device 介面方法都是自由執行緒,這表示讓多個執行緒同時呼叫函式是安全的。

  • 所有 ID3D11DeviceChild衍生介面 (ID3D11BufferID3D11Query等。) 都是自由執行緒。
  • Direct3D 11 會將建立和轉譯的資源分割成兩個介面。 Map、Unmap、Begin、End 和 GetData 是在 ID3D11DeviceCoNtext 上實作,因為 ID3D11Device 會強式定義作業的順序。 ID3D11ResourceID3D11Asynchronous 介面也會實作自由執行緒作業的方法。
  • ID3D11DeviceCoNtext方法 (,但ID3D11DeviceChild) 上存在的方法不是自由執行緒,也就是說,它們需要單一執行緒處理。 一次只能有一個執行緒安全地呼叫其任何方法 (Draw、Copy、Map 等) 。
  • 一般而言,自由執行緒會將所使用的同步處理基本類型數目及其持續時間降到最低。 不過,使用長時間保留同步處理的應用程式,可能會直接影響應用程式可預期達到的並行程度。
ID3D10Device 介面方法並非設計為自由執行緒。 ID3D10Device 會實作所有建立和轉譯功能 (,就像 Direct3D 9 中的 ID3D9Device 一樣。 Map 和 Unmap 是在 ID3D10Resource 衍生介面上實作,Begin、End 和 GetData 是在 ID3D10Asynchronous 衍生介面上實作。

裝置