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

Pat*_*t O 7 c# gdi+ doublebuffered winforms

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

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

Kei*_*thS 3

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

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

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

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