启用桌面合成后还需要双缓冲吗?

在微软的 应用程序兼容性指南:

图形设备接口 (GDI)

在 Windows Vista 和 Windows 之前 Server 2008,窗口句柄 (HWND) 直接画在屏幕上, 这有一定的好处,但是 限制了 Windows 的显示方式和 管理顶级窗口。在 Windows 中 Vista 和 Windows Server 2008,全部 顶级窗口呈现给 屏幕外位图(类似于 WS_EX_LAYERED) 和桌面窗口 管理器将图像组合在一起 绘制桌面。

听起来所有渲染现在都是针对离屏位图完成的:

窗口被渲染为离屏位图

它是否正确?

我问的原因是因为我在标准绘画周期中仍然看到闪烁:

  • WM_ERASEBKGND
  • WM_PAINT

启用桌面合成时:

alt text

我本以为在两次通话之间

   BeginPaint(hWnd, paintStructure);
   ...
   EndPaint(hWnd, paintStructure);

所有绘画都会发生在后台缓冲区:

窗口被渲染为离屏位图

同时,前缓冲区将不受影响。

有帮助吗?

解决方案

它是否正确?

是的(这就是缩略图如何向您显示当前被遮挡的窗口部分的方式)。

DWM 的屏幕渲染是双缓冲的。但是,如果它在擦除和绘画之间占用了您的缓冲区......它将作为可见的人工制品出现。所以你仍然需要双缓冲。双缓冲发生在桌面上(即它完全绘制下一个桌面视图,然后翻转),而不是在每个窗口绘制到的屏幕外缓冲区上。

其他提示

好吧,绘制到离屏位图只是使 DWM 能够按照自己的意愿组合窗口,而无需等待应用程序重新绘制(例如,当您将窗口移到另一个窗口上时,在 XP 中就是这种情况)。

这确实 不是 意味着绘制到屏幕外的表面会自动减少闪烁。如果您擦除窗口,然后重新绘制它,并且在这两个操作之间,DWM 重新绘制屏幕(每秒大约执行 60 次),那么您当然会看到闪烁。

它确实解决了应用程序重绘速度不够快时的“白窗口”问题,并且还减少了由于重叠窗口而导致的重绘。但它无助于防止闪烁。DWM 无法知道您的绘制操作尚未完成,并且您希望在再次绘制内容之前显示窗口的旧图像。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top