如何在XNA中暂停重绘?

use*_*322 15 c# xna throttling

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

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

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


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

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

chu*_*e x 11

您可以使用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;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,SupressDraw仅抑制一个Draw呼叫.为了防止更多的电话Draw,你必须不断地调用SupressDrawUpdate.希望这是有道理的.