【问题标题】:Synchronization between DWM and Direct3D windowDWM 和 Direct3D 窗口之间的同步
【发布时间】:2014-02-04 21:52:31
【问题描述】:

如果应用程序正在绘制到缓冲区(d3d 表面)并且 DWM 需要缓冲区来重绘屏幕或反之亦然,会发生什么?

有没有可用的同步机制?

【问题讨论】:

    标签: direct3d dwm


    【解决方案1】:

    交换链总是有两个或多个缓冲区,并且在任何特定时间,DWM 都拥有其中一个。如果在出现 v-blank 时应用程序没有 Present() 处理新帧,则 DWM 会使用它已有的缓冲区重绘最后一帧。可以通过使当前队列饱和(大约 3 次调用后,下一个将阻塞直到 v-blank)或手动调用WaitForVBlank 来实现同步。在 Windows 8.1 中,使用IDXGISwapChain2::GetFrameLatencyWaitableObject 可以使用更强大的机制。无法强制 DWM 等待应用程序,因为这会挂起整个 OS UI。

    【讨论】:

    • 发布问题后,我又进行了一些谷歌搜索,发现thisthis 的帖子。他们说窗口可以在更新过程中由 DWM 渲染,因此可能会发生“结构撕裂”。这仅与某些旧版本的 Windows 有关吗?
    • @alice 看起来这两个链接都承认“结构撕裂”在渲染中间呈现,例如DrawTriangle(); Present(); DrawRect(); 显然,如果意图是让三角形和矩形同时出现,这种调用模式不会产生正确的效果。不过,这只是糟糕的应用逻辑。
    猜你喜欢
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 2020-10-04
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    相关资源
    最近更新 更多