D3D9渲染视频只有60帧 Direct3DDevice9::Present()阻塞
2024-05-15
23
0
这是因为IDirect3DDevice9::Present()会阻塞,达到的最高fps和屏幕刷新率一样,因为Direct3D有这项机制,认为更新频率高于屏幕刷新率没有实际意义,所以在Present里阻塞了一段时间。
这是一个很方便的功能,但有时我们不想让Present阻塞我们的主循环。微软的Present函数的文档中并没有指出Present阻塞的问题,而是在其他地方说明了,解决办法就是在创建Device的时候指定其更新频率,在D3DPRESENT_PARAMETERS.PresentationInterval这个属性,指定成D3DPRESENT_INTERVAL_IMMEDIATE。
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;//这里是关键
IDirect3DDevice9::Present()阻塞10多毫秒ms才返回,fps只能达到60的原因及解决办法