其实到写这篇文章的时候,DXGI已经出1.5版了,但不少朋友实际上还在用1.2甚至1.1,因此如今谈1.4一点也不过期,并且1.4又是一次很是重大的更新,很值得仔细谈谈。windows
为了支持Direct3D 12(DXGI还处于1.4版本的时候,Direct3D还按照老命名方式叫Direct3D 12,如今已统一改名为DirectX 12),DXGI加入了一下这些新功能:缓存
更廉价的适配器枚举机制多线程
在Direct3D 12里已经不能从device反向追踪建立它的IDXGIAdapter适配器对象了。在调用D3D12CreateDevice的时候也不能指定D3D_DRIVER_TYPE_WARP了。但你能够用IDXFactory4去处理这些事。IDXGIFactory4::EnumAdapterByLuid能够在D3D 12环境下追踪建立device的adapter(与ID3D12Device::GetAdapterLuid结对使用)。若是想让D3D12CreateDevice使用WARP渲染器,要用到IDXGIFactory4::EnumWarpAdapter提供的适配器(Adapter)。ide
视频内存预算追踪函数
微软建议开发者在处理视频内存时使用他们设计的预定内存系统,这样能告知操做系统为开发者预留应用所须要的最低内存。(这是一种很好的机制,但也有些限制)优化
一个系统能为某个应用提供的物理内存数量叫作这个应用的“视频内存预算(video memory budget)”。当后台进程唤醒或睡眠的时候预算会出现极大的波动;当终端用户切换进程的时候预算会急剧变化。应用此时会被系统通知并进行统计当前消费内存和预算内存。应用若是以为预算不够,就会休眠并容许其余应用执行,当时调用的建立类函数也有可能返回错误。IDXGIAdapter3就与此事有关,尤为是QueryVideoMemoryInfo和RegisterVideoMemoryBudgetChangeNotificationEvent。ui
更多相关信息查看这里:Residency。操作系统
Direct3D 12Swapchain 改进线程
为了减少开销,在D3D12中,有些D3D11时代的swapchain功能不建议再使用了。为了更好地对应D3D12中的新概念以及为新功能服务,微软还对API作了其余一些调整,设计
恒定backbuffer一致
在D3D11,应用只能调用GetBUffer(0,…)一次。每次调用Present都隐含着修改了返回接口的一致性。因为CPU开销需求和弹性的资源描述符设计,D3D12再也不支持这种隐性资源一致性变动。那么应用就须要为每块和swapchain一块儿建立的buffer手动调用GetBuffer。应用也得手动渲染在Present操做以后的队列中的buffer。微软也鼓励开发者不要每次Present就重建不少对象,而是给每一个缓冲区(buffer)缓存(cache)。
多适配器支持
在多GPU适配器环境下,backbuffer只从节点1建立,而且只有一个命令队列(command queue,这在DirectX中是至关重要的概念,尤为是多线程多适配器多显示器的环境中)ResizeBuffer容许应用在其余节点建立backbuffer,还容许给每一个backbuffer使用不一样的命令队列。这些功能与swapchain一块儿构建了交替帧渲染(AFR)技术。更多请看Direct3D 12 Multi-Adapters。
杂项
应用全力渲染backbuffer或想更轻巧地支持多适配器场景就应该优先使用DXGI_SWAP_EFFECT_FLIP_DISCARD标识符
若是想优化画面提交过程或正式从前一个已经提交的backbuffer里进行读取就应该用DXGI_SWAPEFFECT_FLIP_SEQUENTIAL标识符
相关话题