启用桌面组合时是否需要双缓冲?
-
12-09-2019 - |
题
启用桌面合成后还需要双缓冲吗?
在微软的 应用程序兼容性指南:
图形设备接口 (GDI)
在 Windows Vista 和 Windows 之前 Server 2008,窗口句柄 (HWND) 直接画在屏幕上, 这有一定的好处,但是 限制了 Windows 的显示方式和 管理顶级窗口。在 Windows 中 Vista 和 Windows Server 2008,全部 顶级窗口呈现给 屏幕外位图(类似于 WS_EX_LAYERED) 和桌面窗口 管理器将图像组合在一起 绘制桌面。
听起来所有渲染现在都是针对离屏位图完成的:
窗口被渲染为离屏位图
它是否正确?
我问的原因是因为我在标准绘画周期中仍然看到闪烁:
- WM_ERASEBKGND
- WM_PAINT
启用桌面合成时:
我本以为在两次通话之间
BeginPaint(hWnd, paintStructure);
...
EndPaint(hWnd, paintStructure);
所有绘画都会发生在后台缓冲区:
窗口被渲染为离屏位图
同时,前缓冲区将不受影响。
解决方案
它是否正确?
是的(这就是缩略图如何向您显示当前被遮挡的窗口部分的方式)。
DWM 的屏幕渲染是双缓冲的。但是,如果它在擦除和绘画之间占用了您的缓冲区......它将作为可见的人工制品出现。所以你仍然需要双缓冲。双缓冲发生在桌面上(即它完全绘制下一个桌面视图,然后翻转),而不是在每个窗口绘制到的屏幕外缓冲区上。
其他提示
好吧,绘制到离屏位图只是使 DWM 能够按照自己的意愿组合窗口,而无需等待应用程序重新绘制(例如,当您将窗口移到另一个窗口上时,在 XP 中就是这种情况)。
这确实 不是 意味着绘制到屏幕外的表面会自动减少闪烁。如果您擦除窗口,然后重新绘制它,并且在这两个操作之间,DWM 重新绘制屏幕(每秒大约执行 60 次),那么您当然会看到闪烁。
它确实解决了应用程序重绘速度不够快时的“白窗口”问题,并且还减少了由于重叠窗口而导致的重绘。但它无助于防止闪烁。DWM 无法知道您的绘制操作尚未完成,并且您希望在再次绘制内容之前显示窗口的旧图像。