Direct3D11中的Device介绍(MSDN中D3D11的教程翻译)
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的接口实现。
posted on 2011-03-14 22:38 Meta.Grfx 阅读(3536) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?