Direct3D11中的Device介绍(MSDN中D3D11的教程翻译)

来源:互联网 发布:kali linux黑路由器 编辑:程序博客网 时间:2024/04/30 16:34

Direct3D11中对象的建模把资源的创建和渲染功能分割到到一个device和一个或多个context中。这种分离的设计是为了便于多线程。

Device

Device用来创建资源和枚举一个显示适配器性能。在Direct3D 11中,device用接口ID3D11Device表示。

每个程序必须至少有一个device,大部分程序一般也只创建一个device。可以通过调用D3D11CreateDeviceD3D11CreateDeviceAndSwapChain来创建一个device,并通过D3D_DRIVER_TYPE标记来指明它要对应于存在于你机器上的那个特定硬件。每个device可以根据需要使用一个或多个context。

Device Context

一个Device Context包含了一个Device使用的环境和设置。进一步来说,一个Device Context用来设置管线状态和生成用于使用属于该Device的资源的渲染命令。Direct3D 11 实现了两种device context,一种是立即渲染,另一种是延迟渲染。这两种contex都是用接口ID3D11DeviceContext表示。

Immediate Context

该上下文用于直接向驱动发送渲染命令。每个device必须且只能有一个“立即上下文”能从GPU获得数据。立即上下文可用来渲染一个

command list.有两种方法获得立即上下文:

#通过调用D3D11CreateDeviceD3D11CreateDeviceAndSwapChain

#通过调用 ID3D11Device::GetImmediateContext

Deferred Context

延迟上下文把GPU指令记入一个command list。该上下文主要用于多线程程序,单线程下没必要使用。延迟上下文一般由工作线程使用,而非主线程。当你创建一个延迟上下文后,该上下文并不从立即上下文中继承任何状态。可调用ID3D11Device::CreateDeferredContext获得延迟上下文。

不管是立即还是延迟的上下文,都可以在任何线程上执行。

线程注意事项

下面标明了D3D11中的线程模型与先前版本的D3D有什么不同:

所有的ID3D11Device接口方法都是线程自由的,所谓线程自由是指在多个线程中可以同时调用同一个函数。

# 所有继承ID3D11DeviceChild接口的子接口(比如ID3D11Buffer,ID3D11Query)都是线程自由的。

# Direct3D11 把资源创建和渲染功能分配到两个接口中。Map,Unmap,Begin,End和GetData由ID3D11DeviceContext实现,因为ID3D11Device严格定义了操作的顺序。ID3D11ResourceID3D11Asynchronous也是线程自由的。

# ID3D11DeviceContext中的方法,除了哪些存在于ID3D11DeviceChild中的方法,都是非线程自由的。同时只能有一个线程调用哪些方法(如Draw,Copy,Map等等)。

# 总体上,线程自由可以最小化需要同步的对象。一个程序使用同步方法会直接影响程序的并行效率。

ID3D10Device 接口不是线程自由的。该接口实现了所有创建和uxuanran的功能(Direct3D9同样也是这样)。Map 和 Unmap由 继承ID3D10Resource的接口实现。Begin,End和GetData由继承了ID3D10Asynchronous的接口实现。

原创粉丝点击