1

启用桌面合成后是否仍需要双缓冲?

在 Microsoft 的应用程序兼容性指南中:

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

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

窗口被渲染为离屏位图

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

4

3 回答 3

1

好吧,绘制到屏幕外位图只是使 DWM 可以随意组合窗口,而不必等待应用程序重绘(例如,在 XP 中将窗口移到另一个上时就是这种情况)。

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

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

于 2009-12-03T15:22:00.197 回答
1

它是否正确?

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

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

于 2009-12-03T15:25:24.190 回答
1

这在 Windows 10(至少 1903 年)中发生了变化。

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

DWM 现在似乎只在绘制完成后才呈现一个新的位图,而不是之前。

于 2019-10-25T10:49:58.000 回答