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

时间:2009-12-03 15:16:57

标签: windows composition aero double-buffering

启用桌面合成时是否还需要双缓冲?

在Microsoft的Application Compatibility Guide中:

  

图形设备接口(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);

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

  

窗口呈现为离屏位图

同时前置缓冲区不受影响。

3 个答案:

答案 0 :(得分:1)

好吧,绘制到屏幕外的位图只是让DWM能够根据需要合成窗口,而不必等待应用程序重绘(例如,当你将窗口移动到另一个窗口时,就像在XP中一样)

意味着绘制到屏幕外表面会自动减少闪烁。如果你擦除窗口然后重新绘制它并在两个动作之间重新绘制屏幕(每秒大约60次),那么当然你会看到闪烁。

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

答案 1 :(得分:1)

  

这是对的吗?

Yup(缩略图可以显示当前被遮挡的部分窗口)。

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

答案 2 :(得分:0)

这已在Windows 10中更改(至少在1903年)。

启用DWM后,默认情况下,现在所有内容都已适当地进行了双缓冲。即使以最基本的方式移动和调整控件大小,重绘/调整大小也不会闪烁。

DWM现在似乎仅在绘画完成后才显示新的位图,而不是在此之前。