本文只是对官方文档做出简单的翻译 原文地址: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派生的接口上实现。