启用桌面合成时是否还需要双缓冲?
在Microsoft的Application Compatibility Guide中:
图形设备接口(GDI)
在Windows Vista和Windows之前 Server 2008,一个窗口句柄(HWND) 直接画在屏幕上, 这有一定的好处,但是 限制Windows如何显示和 管理顶级窗口。在Windows中 所有Vista和Windows Server 2008 顶级窗口呈现为 离屏位图(类似于 WS_EX_LAYERED)和桌面窗口 经理将图像组合在一起 绘制桌面。
听起来所有渲染现在都是在离屏位图上完成的:
窗口呈现为离屏位图
这是对的吗?
我问的原因是因为在标准涂装周期中我仍然看到闪烁:
:
我会假设在调用
之间 BeginPaint(hWnd, paintStructure);
...
EndPaint(hWnd, paintStructure);
所有绘画都会发生在后台缓冲区中:
窗口呈现为离屏位图
同时前置缓冲区不受影响。
答案 0 :(得分:1)
好吧,绘制到屏幕外的位图只是让DWM能够根据需要合成窗口,而不必等待应用程序重绘(例如,当你将窗口移动到另一个窗口时,就像在XP中一样)
不意味着绘制到屏幕外表面会自动减少闪烁。如果你擦除窗口然后重新绘制它并在两个动作之间重新绘制屏幕(每秒大约60次),那么当然你会看到闪烁。
当应用程序没有足够快地重绘时,它确实解决了“白色窗口”问题,并且还减少了由于窗口重叠导致的重绘。但它无助于防止闪烁。 DWM无法知道您的绘制操作尚未完成,并且您希望在您再次绘制内容之前显示窗口的旧图像。
答案 1 :(得分:1)
这是对的吗?
Yup(缩略图可以显示当前被遮挡的部分窗口)。
DWM的屏幕渲染是双缓冲的。然而,如果它在擦除和绘画之后抓住你的缓冲区......它将显示为一个可见的人工制品。所以你仍然需要加倍缓冲。双缓冲发生在桌面上(即它完全绘制下一个桌面视图然后翻转),而不是在每个窗口被绘制到的屏幕外缓冲区上。
答案 2 :(得分:0)
这已在Windows 10中更改(至少在1903年)。
启用DWM后,默认情况下,现在所有内容都已适当地进行了双缓冲。即使以最基本的方式移动和调整控件大小,重绘/调整大小也不会闪烁。
DWM现在似乎仅在绘画完成后才显示新的位图,而不是在此之前。