【问题标题】:Manual control over when to redraw the screen手动控制何时重绘屏幕
【发布时间】:2010-10-29 18:51:48
【问题描述】:

我正在尝试为 XNA 制作一个回合制 Roguelike 引擎。我基本上是从我之前使用名为 libtcod 的基于 SDL 的 roguelike 库所做的工作中移植游戏。如何修改基本的 XNA 模板以使游戏不是每帧都重绘屏幕,而是在我想要的时候重绘?

【问题讨论】:

  • 你为什么要这样做?真的,我很好奇。
  • 好吧,如果您的游戏在用户按下某个键之前图形不会改变,那么一遍又一遍地重新计算和重新绘制所有内容似乎有点愚蠢。

标签: c# xna xbox360 xna-4.0


【解决方案1】:

执行此操作的正确方法是在您想要将后台缓冲区绘制到屏幕上时调用GraphicsDevice.Present()

现在这里的困难在于Game 类会自动为你调用 Present(特别是在Game.EndDraw),这是你不希望它做的事情。幸运的是,Game 提供了多种方法来防止 Present 被调用:

最好的方法是覆盖 BeginDraw 并让它返回 false,以防止绘制框架(包括防止调用 DrawEndDraw),如下所示:

protected override bool BeginDraw()
{
    if(readyToDraw)
        return base.BeginDraw();
    else
        return false;
}

其他替代方法是调用Game.SuppressDraw,或覆盖EndDraw,使其在您准备好在屏幕上显示框架之前不会调用base.EndDraw()

我个人会简单地画每一帧。

【讨论】:

    【解决方案2】:

    您不需要从 Game 类继承,它完全是可选的。您可以编写自己的类,仅在需要时重绘屏幕。不过类中有一些有用的代码,因此您可以使用 Reflector 从那里复制代码,然后更改其逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      相关资源
      最近更新 更多