游戏开发 – 避免闪烁

我在winforms(C#和.netframework 2.0)中开发了类似游戏的俄罗斯方块。 winform有一个背景图像和一个向下移动的图片框(新的位置被分配),间隔为500毫秒。

问题是图片框在图片框之前定位的位置向下移动窗体闪烁的背景图像。 如果我不使用任何背景图像,则没有闪烁。

是否有任何图形加速器或任何类型的解决方案,使用它可以解决闪烁问题。

用于此的术语是Double Buffering 。 这个想法很简单 – 从2个窗格开始,但只显示一个窗格。 绘制到隐藏窗格,然后快速交换隐藏和可见窗格。 冲洗并重复每次转换(动画)。

幸运的是,你不必处理.NET中的这些细节,控件是为你做的。 这个SO问题将帮助您: 如何在表单上双重缓冲.NET控件?

在控件上设置DoubleBuffered = true 。 这应该有助于防止闪烁。

有关DoubleBuffered属性的文档,请参见此处:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered.aspx

如果您正在使用Windows窗体开发游戏,那么您应该重写OnPaint并在每个帧上实现精灵的绘制,而不是移动重量级的PictureBox控件。

如果您使用您提到的方法,您会发现无论DoubleBuffer如何,您都可能获得闪烁。 但是,在OnPaint中完成所有绘图后,DoubleBuffer开始工作。

我做了一个快速搜索,发现这篇有趣的文章,使用OnPaint覆盖在Windows窗体中创建游戏循环 。 特别是看一下GameStateDrawer ,它直接渲染到图形上下文。