Direct3D 11 中的多執行緒簡介
多執行緒的設計目的是藉由同時使用一或多個執行緒來執行工作來改善效能。
在過去,這通常是透過產生單一主執行緒來進行轉譯,以及一或多個執行緒來執行準備工作,例如物件建立、載入、處理等等。 不過,使用 Direct3D 11 中的內建同步處理,多執行緒背後的目標是利用每個 CPU 和 GPU 迴圈,而不讓處理器等候另一個處理器 (特別不會讓 GPU 等候,因為它直接影響畫面播放速率) 。 如此一來,您就可以產生最多工作量,同時維持最佳的畫面播放速率。 由於 API 會實作同步處理,因此不再需要轉譯的單一畫面格概念。
多執行緒需要某種形式的同步處理。 例如,如果應用程式中執行的多個執行緒必須存取單一裝置內容, (ID3D11DeviceCoNtext) ,該應用程式必須使用一些同步處理機制,例如重要區段,才能同步存取該裝置內容。 這是因為轉譯命令的處理 (通常會在 GPU) 上完成,並產生轉譯命令, (透過物件建立、資料載入、狀態變更、資料處理) 通常會使用相同的資源 (紋理、著色器、管線狀態等等) 。 跨多個執行緒組織工作需要同步處理,以防止一個執行緒修改或讀取另一個執行緒正在修改的資料。
雖然使用裝置內容 (ID3D11DeviceCoNtext) 不是安全線程,但使用 Direct3D 11 裝置 (ID3D11Device) 是安全線程。 因為每個 ID3D11DeviceCoNtext 都是單一執行緒,所以一次只能有一個執行緒呼叫 ID3D11DeviceCoNtext 。 如果多個執行緒必須存取單一 ID3D11DeviceCoNtext,則必須使用一些同步處理機制,例如重要區段來同步存取該 ID3D11DeviceCoNtext。 不過,不需要多個執行緒才能使用重要區段或同步處理基本類型來存取單一 ID3D11Device。 因此,如果應用程式使用 ID3D11Device 來建立資源物件,則不需要該應用程式才能同時使用同步處理來建立多個資源物件。
多執行緒支援會將 API 分成兩個不同的功能區域:
多執行緒效能取決於驅動程式支援。 如何:檢查驅動程式支援 提供有關查詢驅動程式的詳細資訊,以及結果的意義。
Direct3D 11 已從頭開始設計來支援多執行緒。 Direct3D 10 使用 安全線程層實作對多執行緒的有限支援。 此頁面列出兩個 DirectX 版本之間的行為差異: Direct3D 版本之間的執行緒差異。
多執行緒和 DXGI
一次只能有一個執行緒使用立即內容。 不過,您的應用程式也應該針對 Microsoft DirectX Graphics Infrastructure (DXGI) 作業使用相同的執行緒,特別是當應用程式呼叫 IDXGISwapChain::P resent 方法時。
注意
與大部分 DXGI 介面函式同時使用立即內容是不正確。 針對 2009 年 3 月和更新版本的 DirectX SDK,唯一安全的 DXGI 函式是 AddRef、 Release和 QueryInterface。
如需搭配多個執行緒使用 DXGI 的詳細資訊,請參閱 多執行緒考慮。
相關主題