http://blog.csdn.net/pizi0475/article/details/7768597
2016-03-15 17:40
295 查看
http://blog.csdn.net/pizi0475/article/details/7768597
Direct3D11中对象的建模把资源的创建和渲染功能分割到到一个device和一个或多个context中。这种分离的设计是为了便于多线程。
Device
Device用来创建资源和枚举一个显示适配器性能。在Direct3D 11中,device用接口ID3D11Device表示。
每个程序必须至少有一个device,大部分程序一般也只创建一个device。可以通过调用D3D11CreateDevice 和D3D11CreateDeviceAndSwapChain来创建一个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.有两种方法获得立即上下文:
#通过调用D3D11CreateDevice 和D3D11CreateDeviceAndSwapChain。
#通过调用 ID3D11Device::GetImmediateContext。
Deferred Context
延迟上下文把GPU指令记入一个command list。该上下文主要用于多线程程序,单线程下没必要使用。延迟上下文一般由工作线程使用,而非主线程。当你创建一个延迟上下文后,该上下文并不从立即上下文中继承任何状态。可调用ID3D11Device::CreateDeferredContext获得延迟上下文。
不管是立即还是延迟的上下文,都可以在任何线程上执行。
线程注意事项
下面标明了D3D11中的线程模型与先前版本的D3D有什么不同:
所有的ID3D11Device接口方法都是线程自由的,所谓线程自由是指在多个线程中可以同时调用同一个函数。
# 所有继承ID3D11DeviceChild接口的子接口(比如ID3D11Buffer,ID3D11Query)都是线程自由的。
# Direct3D11 把资源创建和渲染功能分配到两个接口中。Map,Unmap,Begin,End和GetData由ID3D11DeviceContext实现,因为ID3D11Device严格定义了操作的顺序。ID3D11Resource 和 ID3D11Asynchronous也是线程自由的。
# ID3D11DeviceContext中的方法,除了哪些存在于ID3D11DeviceChild中的方法,都是非线程自由的。同时只能有一个线程调用哪些方法(如Draw,Copy,Map等等)。
# 总体上,线程自由可以最小化需要同步的对象。一个程序使用同步方法会直接影响程序的并行效率。
ID3D10Device 接口不是线程自由的。该接口实现了所有创建和uxuanran的功能(Direct3D9同样也是这样)。Map 和 Unmap由 继承ID3D10Resource的接口实现。Begin,End和GetData由继承了ID3D10Asynchronous的接口实现。
Direct3D11中对象的建模把资源的创建和渲染功能分割到到一个device和一个或多个context中。这种分离的设计是为了便于多线程。
Device
Device用来创建资源和枚举一个显示适配器性能。在Direct3D 11中,device用接口ID3D11Device表示。
每个程序必须至少有一个device,大部分程序一般也只创建一个device。可以通过调用D3D11CreateDevice 和D3D11CreateDeviceAndSwapChain来创建一个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.有两种方法获得立即上下文:
#通过调用D3D11CreateDevice 和D3D11CreateDeviceAndSwapChain。
#通过调用 ID3D11Device::GetImmediateContext。
Deferred Context
延迟上下文把GPU指令记入一个command list。该上下文主要用于多线程程序,单线程下没必要使用。延迟上下文一般由工作线程使用,而非主线程。当你创建一个延迟上下文后,该上下文并不从立即上下文中继承任何状态。可调用ID3D11Device::CreateDeferredContext获得延迟上下文。
不管是立即还是延迟的上下文,都可以在任何线程上执行。
线程注意事项
下面标明了D3D11中的线程模型与先前版本的D3D有什么不同:
所有的ID3D11Device接口方法都是线程自由的,所谓线程自由是指在多个线程中可以同时调用同一个函数。
# 所有继承ID3D11DeviceChild接口的子接口(比如ID3D11Buffer,ID3D11Query)都是线程自由的。
# Direct3D11 把资源创建和渲染功能分配到两个接口中。Map,Unmap,Begin,End和GetData由ID3D11DeviceContext实现,因为ID3D11Device严格定义了操作的顺序。ID3D11Resource 和 ID3D11Asynchronous也是线程自由的。
# ID3D11DeviceContext中的方法,除了哪些存在于ID3D11DeviceChild中的方法,都是非线程自由的。同时只能有一个线程调用哪些方法(如Draw,Copy,Map等等)。
# 总体上,线程自由可以最小化需要同步的对象。一个程序使用同步方法会直接影响程序的并行效率。
ID3D10Device 接口不是线程自由的。该接口实现了所有创建和uxuanran的功能(Direct3D9同样也是这样)。Map 和 Unmap由 继承ID3D10Resource的接口实现。Begin,End和GetData由继承了ID3D10Asynchronous的接口实现。
相关文章推荐
- 220. Contains Duplicate III
- PowerDesigner打开设计文件后提示failed to read the fileXXX的解决办法
- Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATI
- B - Pairs Forming LCM——(LightOJ 1236)
- mybaits中的<trim>标签的作用
- sakai创建工具的过程,以roster2为例
- IBM openblockchain学习(一)--obc-peer环境搭建
- 219. Contains Duplicate II
- sakai和jcloud操作流程
- 20160315 Sail Studio 2244 剪格子,2324 N^3,2230 K好数
- 配置Git的user name和email
- Bayesian Classifier (Naive Bayesian Classifier - 朴素贝叶斯分类)
- 应用环境下的TIME_WAIT和CLOSE_WAIT
- DTM initialization: failure during startup recovery, retry failed, check segment status (cdbtm.c:1603)
- 修复.MYI'; try to repair it
- LeetCode: Factorial Trailing Zeroes
- AIX 夏令时
- weblogic Unable to obtain lock on
- genymotion的 INSTALL_FAILED_CPU_ABI_INCOMPATIBLE