与桌面组合需要双缓冲启用?(Is Double-buffering required with De

2019-10-18 13:04发布

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

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

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

所有的画会发生在一个后台缓存:

窗口被呈现给离屏位图

与此同时,前缓冲器将保持不变。

Answer 1:

这个对吗?

是啊(这是缩略图怎么可以告诉你当前遮蔽窗口的部分)。

屏幕的DWM的渲染是双缓冲。 但是,如果抓住你的缓冲betewen擦除和绘画......它会显示为一个可见的假象。 所以,你仍然需要双缓冲。 双缓冲发生在桌面上(即,它完全绘制下一个桌面视图,然后翻转),而不是在每一个窗口被吸引到离屏缓冲器。



Answer 2:

好了,画到离屏位图只是使DWM复合窗,因为它喜欢,而无需等待应用程序重绘(如在XP的情况下,当你移动窗口通过另一个,例如)。

并不意味着绘制到屏幕外表面自动地减少闪烁。 如果删除的窗口,然后重新绘制和DWM两个动作之间刷新屏幕(这确实每秒约60次),那么你当然会看到闪烁。

它解决了“白色的窗户”的问题时,应用程序不重绘速度不够快,同时也减少了重绘由于重叠窗口。 不过,这并不利于防止闪烁。 该DWM不可能知道您的油漆操作尚未完成的方式,你希望有显示,直到你再次绘制的内容后,该窗口的旧形象。



文章来源: Is Double-buffering required with Desktop Composition enabled?