我正在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
。