【发布时间】:2014-02-04 21:52:31
【问题描述】:
如果应用程序正在绘制到缓冲区(d3d 表面)并且 DWM 需要缓冲区来重绘屏幕或反之亦然,会发生什么?
有没有可用的同步机制?
【问题讨论】:
如果应用程序正在绘制到缓冲区(d3d 表面)并且 DWM 需要缓冲区来重绘屏幕或反之亦然,会发生什么?
有没有可用的同步机制?
【问题讨论】:
交换链总是有两个或多个缓冲区,并且在任何特定时间,DWM 都拥有其中一个。如果在出现 v-blank 时应用程序没有 Present() 处理新帧,则 DWM 会使用它已有的缓冲区重绘最后一帧。可以通过使当前队列饱和(大约 3 次调用后,下一个将阻塞直到 v-blank)或手动调用WaitForVBlank 来实现同步。在 Windows 8.1 中,使用IDXGISwapChain2::GetFrameLatencyWaitableObject 可以使用更强大的机制。无法强制 DWM 等待应用程序,因为这会挂起整个 OS UI。