2010-09-08 47 views
7

我正在C#中进行游戏(2.0或3.5 havn't尚未决定)。该游戏将在具有六边形网格的地图上播放。我明白这张地图的用户界面应该使用双缓冲(大量图层,如此缓慢的绘图)。我知道我可以通过样式启用双缓冲,或创建自己的缓冲区并自行处理。我在网上找到的大多数推荐是自己处理。我想知道为什么?显然这可以让我避免控制双缓冲所固有的假设,但我不知道这些假设是什么。我为什么要做手动双缓冲?

再说一遍,我不是找代码来解释如何双缓冲我的控制,而是为什么我反而建立这个自己使用双缓冲的风格,并允许CLR /控制类来处理呢?

回答

3

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

  • ,当你刚设置的应用程序绘制双缓冲创建的绘图缓冲器被用来绘制整个窗口以及所有子控件,而不仅仅是您的自定义绘图区域,因此您需要在页面翻转之前添加在后台缓冲区中重绘每个GUI元素的开销。
  • 如果有任何操作使控件失效,则调用Paint方法。发生这种情况时您可能无法完成绘图,因此您会看到向用户显示的图像不完整(实时图形效果不佳)。

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

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

4

MSDN

为了图形密集型应用程序 如动画,有时可以 使用,而不是由 BufferedGraphicsManager提供的BufferedGraphicsContext 的 专用BufferedGraphicsContext 提高性能。这使 您可以创建和管理独立显卡 缓冲区,没有 招致 管理与自己0​​应用程序相关联的所有其他缓冲 显卡的性能开销,尽管应用程序占用的内存 将 更大。

编辑:我也发现从鲍勃鲍威尔this文章可能会有所帮助

手动双缓冲可能是有用的 ,如果你不希望系统所以请 假设你这样的因为 的背景是不透明的,还是 透明,或者如果你想 创建更复杂的缓冲 系统。有几条简单的规则 ,您需要遵循以获得手动 双缓冲权。

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

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

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

+0

谢谢,但我已经完成了网页搜索:-) – 2010-09-10 14:57:21