天天看點

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内容更新将被忽略。