我正在开发一个C#游戏(2.0或3.5还没有决定).游戏将在具有六边形网格的地图上播放.我很欣赏这张地图的UI应该使用双缓冲(很多层,所以慢绘).我知道我可以通过样式启用双缓冲,或者创建我自己的缓冲区并自己处理它.我在网上找到的大多数建议都是自己处理.我想知道为什么?显然,这允许我避免控制双缓冲中固有的假设,但我不知道这些假设是什么.
同样,我不是在寻找代码来解释如何对我的控件进行双缓冲,而是为什么我自己构建它而不是使用双缓冲样式并允许CLR / Control类来处理它?
解决方法
在WFA中,双缓冲会降低性能,而不会完全消除自定义图形区域中的闪烁.对于内置的GUI元素,就像创建一个由
ImageButtons和Labels构建的游戏一样,内置的双缓冲模式非常适合隐藏重绘控件树.但是,将它用于自定义绘图区域有几个主要问题:
>当您设置应用程序以绘制双缓冲时创建的绘制缓冲区用于绘制整个窗口和所有子控件,而不仅仅是您的自定义绘图区域,因此您添加了重绘背面缓冲区上每个GUI元素的开销页面翻转之前.
>如果控件无效,则调用Paint方法.当发生这种情况时,您可能无法完成绘图,因此您将向用户显示未完整的图像(实时图形效果不佳).
通过保持基本窗口GUI单缓冲,但创建一个控制缓冲的区域,这两个问题都被最小化.
双缓冲方法可以像创建一个Bitmap对象作为后缓冲区一样简单,并在你准备就绪时将其绘制到绘图区域,或者设置一个单独的BufferedGraphicsContext来管理自定义绘图区域的缓冲.