【发布时间】:2012-05-30 19:21:57
【问题描述】:
我正在用 winforms(C# 和 .netframework 2.0)开发一个类似俄罗斯方块的游戏。 winform有一个背景图片和一个图片框,每隔500ms向下移动(分配新位置)。
问题是当图片框向下移动时,表单的背景图像在图片框之前所在的位置闪烁。如果我不使用任何背景图片,那么就没有闪烁。
是否有任何图形加速器或任何可以解决闪烁问题的解决方案。
【问题讨论】:
我正在用 winforms(C# 和 .netframework 2.0)开发一个类似俄罗斯方块的游戏。 winform有一个背景图片和一个图片框,每隔500ms向下移动(分配新位置)。
问题是当图片框向下移动时,表单的背景图像在图片框之前所在的位置闪烁。如果我不使用任何背景图片,那么就没有闪烁。
是否有任何图形加速器或任何可以解决闪烁问题的解决方案。
【问题讨论】:
如果你在 Windows 窗体中开发游戏,你真的应该重写 OnPaint 并在每一帧上实现精灵的绘制,而不是移动重量级的 PictureBox 控件。
如果您使用您提到的方法,您会发现无论 DoubleBuffer 为何都会出现闪烁。然而,在 OnPaint 中完成所有绘图后,DoubleBuffer 开始工作。
我进行了快速搜索,并使用 OnPaint 覆盖在 creating a game-loop in Windows Forms 上找到了这篇有趣的文章。特别看一下GameStateDrawer,它直接对图形上下文进行渲染。
【讨论】:
用于此的术语是Double Buffering。这个想法很简单 - 从 2 个窗格开始,但只显示一个。绘制到隐藏窗格,并快速交换隐藏和可见窗格。冲洗并重复每个过渡(动画)。
幸运的是,您不必在 .NET 中处理这些细节,控件会为您完成。这个 SO 问题将对您有所帮助:How to double buffer .NET controls on a form?
【讨论】:
在您的控件上设置DoubleBuffered = true。这应该有助于防止闪烁。
有关DoubleBuffered 属性的文档,请参见此处:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered.aspx
【讨论】: