代码之家  ›  专栏  ›  技术社区  ›  Pat O

我为什么要做手动双缓冲?

  •  7
  • Pat O  · 技术社区  · 15 年前

    我正在C开发一款游戏(2.0版或3.5版尚未决定)。游戏将在六边形网格的地图上进行。我很欣赏这个地图的用户界面应该使用双缓冲(很多层,绘制速度很慢)。我知道我可以通过一个样式启用双重缓冲,或者创建自己的缓冲并自己处理它。我在网上找到的大多数建议是自己处理。我想知道为什么?显然,这允许我避免控制双缓冲中固有的假设,但我不知道这些假设是什么。

    同样,我也不是在寻找解释如何对控件进行双重缓冲的代码,而是为什么我要自己构建它,而不是使用双重缓冲样式并允许clr/control类处理它?

    2 回复  |  直到 15 年前
        1
  •  3
  •   KeithS    15 年前

    在WFA中,双缓冲会降低性能,而不会完全消除自定义图形区域中的闪烁。对于内置的GUI元素,例如,如果您创建一个由图像按钮和标签构建的游戏,那么内置的双缓冲模式非常适合隐藏控制树的重绘。但是,在自定义绘图区域中使用它有几个主要问题:

    • 当您刚将应用程序设置为绘制双缓冲区时创建的绘制缓冲区用于绘制整个窗口和所有子控件,而不仅仅是您的自定义绘图区域,因此在翻页之前,您添加了在后台缓冲区重新绘制每个GUI元素的开销。
    • 如果有任何内容使控件无效,则调用paint方法。当这种情况发生时,您可能无法完成绘图,因此会向用户显示不完整的图像(实时图形效果不佳)。

    通过保持基本窗口GUI的单一缓冲,但创建一个控制缓冲的区域,这两个问题都被最小化了。

    双缓冲方法可以简单到创建一个位图对象作为后缓冲,并在准备好后将其绘制到绘图区域,或者设置单独的BufferedGraphicsContext来管理自定义绘图区域的缓冲。

        2
  •  4
  •   Iain Ward    15 年前

    MSDN :

    对于图形密集型应用程序 比如动画,有时候你可以 通过使用 专用BufferedGraphicsContext 而不是BufferedGraphicsContext 提供的 BufferedGraphicsManager。这使得 创建和管理图形 单独缓冲,无 导致 管理所有其他缓冲区 与您的 应用程序,通过内存 应用程序将使用 更大的。

    编辑 我也发现了 this Bob Powell的文章,可能会有所帮助

    手动双缓冲可能有用 如果你不想要这个系统,那么做 对你的假设,比如 背景不透明或 透明的,或者如果你想 创建更复杂的缓冲 系统。有几个简单的规则 你需要遵循它来获取手册 双缓冲右侧。

    首先,不要创建新的back buffer 每次绘图周期。只创建或 当窗口的 客户端大小更改。第二,只有 创建所需大小的位图。 清除像素需要时间,因此如果 像素比你需要的多, 你只是在浪费处理器周期。 最后,使用最简单的绘图方法 将位图复制到屏幕。 DrawImageUnscaled是一种方法 在这里。

    编辑 :另一个原因是您可能希望应用程序控制缓冲,而不是控件本身。

    来源: Pro .NET 2.0 Windows Forms and custom controls in C#