如何在XNA中暂停重绘?

我制作了一个XNA图像查看器,但它总是重绘场景,即使它没有改变,而且它让我的上网本烧得像地狱一样,所以我希望它在没有任何变化时暂停绘图。

将帧率降低到1是保持冷却的一种方法,但它会导致输出滞后。

如何在没有输入的情况下阻止重绘?


这个问题已经解决了,但是发现了另一个问题 – 游戏在窗口聚焦时消耗了大量的CPU,但是当它不是时,它只需要大约1%的CPU。 有关如何解决此其他问题的详细信息,请参阅此问题:

如何在没有值得计算的情况下减少XNA游戏的CPU使用率?

您可以使用Game.SupressDraw方法来实现此目的。 从链接的评论:

在Update期间调用此方法以防止在下次调用Update之后调用Draw。 如果显示器因更新而未发生变化,则此方法可用于小型设备以延长电池寿命。 例如,如果屏幕是静态的而没有背景动画,则可以在更新期间检查播放器输入以确定播放器是否正在执行任何操作。 如果未检测到输入,则此方法允许游戏跳过绘图直到下一次更新。

例如,以下代码仅调用Draw函数一次。 当我测试这个时,我注意到没有SuppressDraw调用的CPU使用率很高(70%)。 使用SupressDraw ,CPU使用率急剧下降(低于15%)。 您的号码可能会有所不

 public class Game1 : Microsoft.Xna.Framework.Game { ... private bool _drawn = false; protected override void Update(GameTime gameTime) { if (_drawn) SuppressDraw(); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); /* draw stuff here */ spriteBatch.End(); _drawn = true; } ... } 

请注意, SupressDraw仅抑制一次Draw调用。 要防止更多调用Draw ,您必须在Update不断调用SupressDraw 。 希望这是有道理的。

如接受的答案所示,您可以使用SuppressDraw来避免绘制未更改的帧。 但是,您的Update方法将运行,这就是为什么它仍然使用比您预期的更多的CPU。 为了避免使用尽可能多的CPU,您需要以某种方式避免更新自上一帧以来您知道没有更改的内容。

我假设你会知道这与你知道什么时候压缩绘图一样,所以你需要做的是重新排列你的Update方法,如下所示:

 private void Update(GameTime gameTime) { var frameHasChanges = DetectChanges(); //This method you need to figure out yourself if (!frameHasChanges) { SuppressDraw(); base.Update(gameTime); return; } //Do the rest of normal Update } 

作为最后的说明; 我从来没有在任何我做过的游戏中使用它。 我觉得你可能会遇到其他一些潜在的性能问题。 但是,我使用了许多技术来避免在每个帧上渲染文本等(导致装箱/拆箱)。 如果您想了解更多,请在评论中询问此事。