7

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

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

4

2 回答 2

4

来自女士

对于动画等图形密集型应用程序,有时可以通过使用专用的 BufferedGraphicsContext 而不是 BufferedGraphicsManager 提供的 BufferedGraphicsContext 来提高性能。这使您能够单独创建和管理图形缓冲区,而不会产生管理与您的应用程序关联的所有其他缓冲图形的性能开销,尽管应用程序消耗的内存会更大。

编辑:我还发现Bob Powell 的这篇文章可能会有所帮助:

如果您不想要该系统,手动双缓冲可能很有用,因此请为您做出假设,例如背景是不透明的还是透明的,或者如果您想创建更复杂的缓冲系统。您需要遵循一些简单的规则才能获得正确的手动双缓冲。

首先,不要在每个绘制周期都创建一个新的后台缓冲区。仅当窗口的客户端大小更改时才创建或销毁位图。其次,只创建您需要大小的位图。清除像素需要时间,因此如果像素多于您的需要,您只是在浪费处理器周期。最后,使用最简单的绘制方法将位图复制到屏幕上。DrawImageUnscaled 是这里的方法。

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

来源:Pro .NET 2.0 Windows 窗体和 C# 中的自定义控件

于 2010-09-08T16:10:31.560 回答
3

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

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

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

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

于 2010-09-08T16:21:29.810 回答