2014-01-16 53 views
0

如果应用程序正在绘制到缓冲区(d3d曲面)中间并且DWM需要缓冲区来重新绘制屏幕,​​反之亦然,会发生什么情况?DWM和Direct3D窗口之间的同步

有没有可用的同步机制?

回答

0

交换链总是有两个或多个缓冲区,并且在任何特定时间,DWM都拥有其中一个缓冲区。如果在发生虚拟空白时应用程序编辑的新帧不是Present(),则DWM会使用它现有的缓冲区重绘最后一帧。同步可以通过饱和当前队列(3次左右的呼叫后,下一次会阻塞直到v空白)或手动呼叫WaitForVBlank来实现。在Windows 8.1中,使用IDXGISwapChain2::GetFrameLatencyWaitableObject的机制更加健壮。无法强制DWM等待应用程序,因为这会挂起整个OS UI。

+1

在发布问题后,我做了更多的搜索,并找到[this](http://blogs.msdn.com/b/greg_schechter/archive/2006/03/10/549310.aspx)和[this]( http://stackoverflow.com/questions/1840516/is-double-buffering-required-with-desktop-composition-enabled)后。他们说这个窗口可以在DWM更新的过程中渲染,所以“结构撕裂”可能发生。这只是关系到一些旧版本的Windows? – alice

+0

@alice它看起来像这些链接都承认“结构撕裂”作为呈现中的呈现,例如, 'DrawTriangle();当下(); DrawRect();'显然,如果意图是同时出现三角形和矩形,这个调用模式不会产生正确的效果。但这只是糟糕的应用程序逻辑。 – MooseBoys