【问题标题】:Game Development - Avoiding Flickers游戏开发 - 避免闪烁
【发布时间】:2012-05-30 19:21:57
【问题描述】:

我正在用 winforms(C# 和 .netframework 2.0)开发一个类似俄罗斯方块的游戏。 winform有一个背景图片和一个图片框,每隔500ms向下移动(分配新位置)。

问题是当图片框向下移动时,表单的背景图像在图片框之前所在的位置闪烁。如果我不使用任何背景图片,那么就没有闪烁。

是否有任何图形加速器或任何可以解决闪烁问题的解决方案。

【问题讨论】:

    标签: c# .net winforms graphics


    【解决方案1】:

    如果你在 Windows 窗体中开发游戏,你真的应该重写 OnPaint 并在每一帧上实现精灵的绘制,而不是移动重量级的 PictureBox 控件。

    如果您使用您提到的方法,您会发现无论 DoubleBuffer 为何都会出现闪烁。然而,在 OnPaint 中完成所有绘图后,DoubleBuffer 开始工作。

    我进行了快速搜索,并使用 OnPaint 覆盖在 creating a game-loop in Windows Forms 上找到了这篇有趣的文章。特别看一下GameStateDrawer,它直接对图形上下文进行渲染。

    【讨论】:

    • 你的建议是正确的,我使用双缓冲后仍然闪烁。谢谢。
    • 是的 :) 在切换到 WPF 之前,我在 WinForms 图形控件上工作了大约 5 年。使用带有双缓冲的 OnPaint 方法。您将需要创建一个粗略的游戏引擎来在特定位置绘制精灵。它会起作用的!
    【解决方案2】:

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

    幸运的是,您不必在 .NET 中处理这些细节,控件会为您完成。这个 SO 问题将对您有所帮助:How to double buffer .NET controls on a form?

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 2013-05-02
        相关资源
        最近更新 更多