代码之家  ›  专栏  ›  技术社区  ›  Ian Boyd

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

  •  1
  • Ian Boyd  · 技术社区  · 16 年前

    启用桌面组合时是否仍需要双缓冲?

    在微软 Application Compatibility Guide :

    图形设备接口(GDI)

    在Windows Vista和Windows之前 服务器2008,窗口句柄(hwnd) 直接画在屏幕上, 有一定的好处,但是 限制了Windows的显示方式和 管理顶级窗口。在Windows中 Vista和Windows Server 2008,全部 顶层窗口呈现为 屏幕外位图(类似于 和桌面窗口 管理器将图像组合在一起 绘制桌面。

    听起来所有渲染现在都已完成为非屏幕位图:

    窗口呈现为非屏幕位图

    这是正确的吗?

    我问的原因是因为在标准的喷漆周期中我仍然看到闪烁:

    • 威斯拉斯堡
    • 水彩画

    启用桌面组合时:

    alt text http://i48.tinypic.com/1zdanwj.jpg

    我本以为在打电话到

       BeginPaint(hWnd, paintStructure);
       ...
       EndPaint(hWnd, paintStructure);
    

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

    窗口呈现为非屏幕位图

    同时,前端缓冲区不会受到影响。

    2 回复  |  直到 16 年前
        1
  •  1
  •   DrPizza    16 年前

    这是正确的吗?

    是的(这就是缩略图如何显示当前被遮挡的窗口部分)。

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

        2
  •  1
  •   Joey Gumbo    16 年前

    好吧,绘制到屏幕外位图只允许DWM按照自己喜欢的方式组合窗口,而不必等待应用程序重新绘制(例如,在XP中,当您将窗口移到另一个位图上时)。

    这确实 也就是说,从屏幕外表面自动绘制可以减少闪烁。如果您擦除窗口,然后重新绘制它,并且在两个操作之间,DWM重新绘制屏幕(每秒大约60次),那么您当然会看到闪烁。

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

    推荐文章