DXGI 1.4的新特性

    其实到写这篇文章的时候,DXGI已经出1.5版了,但不少朋友实际上还在用1.2甚至1.1,因此如今谈1.4一点也不过期,并且1.4又是一次很是重大的更新,很值得仔细谈谈。windows

    为了支持Direct3D 12(DXGI还处于1.4版本的时候,Direct3D还按照老命名方式叫Direct3D 12,如今已统一改名为DirectX 12),DXGI加入了一下这些新功能:缓存

  • 更廉价的适配器枚举机制
  • 视频内存预算追踪
  • Direct3D 12Swapchain 改进
  • 相关话题

更廉价的适配器枚举机制多线程

    在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

杂项

  • 命令队列再也不传给D3D的device对象而必定要传给CreateSwapChain方法。
  • 只支持如下两个flip mode swap effects:

    应用全力渲染backbuffer或想更轻巧地支持多适配器场景就应该优先使用DXGI_SWAP_EFFECT_FLIP_DISCARD标识符

    若是想优化画面提交过程或正式从前一个已经提交的backbuffer里进行读取就应该用DXGI_SWAPEFFECT_FLIP_SEQUENTIAL标识符

  • SetFullscreenState对显示再也不具有排斥性,因此用户初始化的操做系统元素能够无缝显示在应用输出的前面。好比说体设定(Volume Settings)。

相关话题

Direct3D 12 Hardware Feature Levels
Programming Guide for DXGI
相关文章
相关标签/搜索