本文只是對官方文檔做出簡單的翻譯 原文地址:Introduction to a Device in Direct3D 11
Introduction to a Device in Direct3D 11
Direct3D 11對象模型將資源創建和渲染功能分爲設備和一個或多個上下文。 這種分離旨在促進多線程。
Device(設備)
Device用於創建資源並枚舉顯示適配器的功能。 在Direct3D 11中,device用ID3D11Device接口表示。
每個應用程序必須至少具有一個device,大多數應用程序只能創建一個device。 通過調用D3D11CreateDevice 或 D3D11CreateDeviceAndSwapChain 爲您的計算機上安裝的硬件驅動程序創建設備,並使用D3D_DRIVER_TYPE標誌指定驅動程序類型。 每個設備可以使用一個或多個Device Context,具體取決於所需的功能。
Device Context(設備上下文)
Device Context 包含使用 device 的環境或設置。更具體地,Device Context 用於設置流水線狀態並使用Device 擁有的資源生成渲染命令。 Direct3D 11實現了兩種類型的設備上下文,一種用於即時渲染(immediate rendering),另一種用於延遲渲染(deferred rendering)。這兩個上下文都使用ID3D11DeviceContext接口表示。
Immediate Context
Immediate Context 直接呈現給驅動程序。每個設備只有一個唯一的Immediate Context,可以從GPU檢索數據。Immediate Context可用於立即呈現(或回放)命令列表。
有兩種獲取即時上下文的方法:
Deferred Context
Deferred Context 將GPU命令記錄到命令列表中。Deferred Context主要用於多線程,單線程應用程序則不需要。延遲上下文通常由工作線程而不是主渲染線程使用。創建Deferred Context 時,它不會從 Immediate Context 中繼承任何狀態。
要獲取延遲的上下文,請調用ID3D11Device :: CreateDeferredContext。
只要context僅在一個線程中使用,則任何context(Immediate或Deferred)都可以使用。
線程注意事項(Threading Considerations)
下表顯示了Direct3D 11中的線程模型與Direct3D的早期版本的區別。
Direct3D 11與早期版本的Direct3D之間的區別:
- 所有ID3D11Device接口方法都是線程安全的,這意味着讓多個線程同時調用函數是安全的。
- 所有ID3D11DeviceChild派生的接口(ID3D11Buffer,ID3D11Query等)都是線程安全的。
- Direct3D 11將資源創建和渲染分爲兩個接口。因爲ID3D11Device嚴格定義了操作順序,所以在ID3D11DeviceContext上實現了Map,Unmap,Begin,End和GetData。ID3D11Resource和ID3D11Asynchronous接口還實現了用於線程安全操作的方法。
- ID3D11DeviceContext方法(除了ID3D11DeviceChild中存在的方法之外)不是線程安全的,也就是說,它們需要單線程。一次只有一個線程可以安全地調用其任何方法(繪圖,複製,映射等)。
- 通常,線程安全可最大程度地減少使用的同步原語及其持續時間。但是,使用長時間保持同步的應用程序可以直接影響應用程序可以預期實現的併發程度。
ID3D10Device接口方法並非設計爲線程安全。 ID3D10Device實現所有創建和呈現功能(Direct3D 9中的ID3D9Device也是如此)。 Map和Unmap在ID3D10Resource派生的接口上實現,Begin,End和GetData在ID3D10Asynchronous派生的接口上實現。