天天看点

DXGI中的flip显示模型

从win8开始,就增加了flip显示模型,通过该显示模型,程序可以减少系统开销,同时增加性能。基于intel media

sdk解码,d3d11渲染,在我自己的电脑上通过对比,该模型确实可以明显降低CPU负载,渲染时间几乎忽略不计。不过坑爹的是,在部分独显不同电脑上,该模型并没有发挥出来该有的作用,反而增加GPU很大的负载,得不偿失。在d3d12中只支持flip model渲染,我想这些坑爹的电脑也就不支持d3d12渲染显示了,没想到这个flip model跟显卡类型,驱动等关系很大。下面简单说下flip model渲染。

桌面窗口管理器

桌面窗口管理器是Vista以后的系统中的一个新组件:Desktop Window Manager(DWM)。常见的任务栏窗口的实时缩略图效果,aero效果都是是DWM提供的。DWM提供了基于硬件加速的渲染。DWM出现后,应用程序的显示不再是直接画到屏幕上,而是送到显存中的一个离屏Surface。DWM将这些Surface合成一幅图像显示到屏幕之上。所以现在我们看到的显示器所有内容都是DWM处理过的。

DXGI flip model 与BitBlt model对比

二者主要区别是后台缓冲如何送到WDM。对于bitblt model,调用一次

IDXGISwapChain1::Present1

,后台缓冲内容就被拷贝到DWM 中一个叫做redirection surface的地方。对于flip model,后台缓冲内容直接与DWM共享,少了拷贝操作,因此更高效。

DXGI中的flip显示模型

如何使用

创建交换链时。DXGI_SWAP_CHAIN_DESC1结构体按如下要求填充:

1)SwapEffect:DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL

2)BufferCount:2

3)Format:DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM,DXGI_FORMAT_R8G8B8A8_UNORM之一;

4)SampleDesc.Count :1;

5)SampleDesc.Quality:0。

每一次调用Present1前,都要调用一次

ID3D11DeviceContext::OMSetRenderTargets

,因为Present1后,系统会把

RenderTargetView

解绑,所以每次都需要再调用

OMSetRenderTargets

设置

RenderTargetView

注意事项

1)一个窗口句柄只能绑定一个flip model交换链;

2)使用了flip model的句柄,就不能再使用其他api绘制了。在flip model中,只有flip model交换链传递到DWM中的Direct3D内容才可见,其他版本Direct3D 以及GDI内容更新将被忽略。