共用方式為


Direct3D 11 中的多線程簡介

多線程的設計目的是藉由同時使用一或多個線程來執行工作來改善效能。

過去,這通常是藉由產生單一主線程進行轉譯,以及一或多個線程來執行準備工作,例如物件建立、載入、處理等等。 不過,使用 Direct3D 11 中的內建同步處理,多線程背後的目標是利用每個 CPU 和 GPU 週期,而不讓處理器等候另一個處理器(特別是不要讓 GPU 等候,因為它直接影響幀速率)。 如此一來,您就可以在維持最佳幀速率的同時產生最多的工作量。 由於 API 實作了同步處理,因此不再需要渲染的單一框架概念。

多線程需要某種形式的同步處理。 例如,如果應用程式中執行的多個線程必須存取單一裝置內容 (ID3D11DeviceContext),該應用程式必須使用某些同步處理機制,例如重要區段,同步存取該裝置內容。 這是因為處理轉譯命令(通常是在 GPU 上完成),並產生轉譯命令(通常透過物件建立、數據載入、狀態變更、數據處理在 CPU 上完成)通常會使用相同的資源(紋理、著色器、管線狀態等等)。 跨多個線程組織工作需要同步處理,以防止一個線程修改或讀取另一個線程正在修改的數據。

雖然使用裝置內容(ID3D11DeviceContext)不具線程安全性,但使用 Direct3D 11 裝置(ID3D11Device)具線程安全性。 因為每個 ID3D11DeviceContext 都是單個線程,因此一次只能呼叫一個 ID3D11DeviceContext。 如果多個線程必須存取單一 ID3D11DeviceContext,則必須使用某些同步處理機制,例如重要區段,同步存取該 ID3D11DeviceContext。 不過,不需要多個執行緒就能使用重要區段或同步處理基本類型來存取單一 ID3D11Device。 因此,如果應用程式使用 ID3D11Device 來建立資源物件,則不需要該應用程式使用同步處理來同時建立多個資源物件。

多線程支援會將 API 分成兩個不同的功能區域:

多線程效能取決於驅動程序支援。 如何:檢查驅動程式支援 提供有關查詢驅動程式的詳細資訊,以及結果的意義。

Direct3D 11 已從頭開始設計來支援多線程。 Direct3D 10 使用 安全線程層實作對多線程的有限支援。 此頁面列出兩個 DirectX 版本之間的行為差異:Direct3D 版本之間的線程差異

多線程和 DXGI

一次只能有一個線程使用即時上下文。 不過,您的應用程式也應該針對 Microsoft DirectX Graphics Infrastructure (DXGI) 作業使用相同的執行緒,特別是當應用程式呼叫 IDXGISwapChain::Present 方法時。

注意

與大部分 DXGI 介面函式同時使用立即上下文是無效的。 針對 2009 年 3 月和更新版本的 DirectX SDK,唯一安全的 DXGI 函式是 AddRefReleaseQueryInterface

 

如需使用多執行緒搭配 DXGI 的更多資訊,請參閱 多執行緒考量

多線程