删除焦点时XNA运行缓慢

时间:2013-02-22 19:35:51

标签: xna lostfocus

我只是想知道,在制作游戏时,我注意到当我的游戏具有焦点时,IsRunningSlowly的GameTime值会返回false(就像它应该的那样),但是当我更改应用程序时,它会变为true。我甚至做了一个空的游戏,即使失去焦点,IsRunningSlowly的GameTime值也会返回true。我想知道它为什么这样做?它只是我的电脑,还是XNA的创造者是这样设计的?帧速率似乎很好,但值是真的。没什么大不了的,我真的很好奇!

[空游戏]

    public class Game1 : Microsoft.Xna.Framework.Game
{
    #region Constuctors

    public Game1()
    {
        this.GraphicsManager = new Microsoft.Xna.Framework.GraphicsDeviceManager(this);
        this.Content.RootDirectory = "Content";
    }

    #endregion
    #region Overrides

    protected override void LoadContent()
    {
        this.SpriteBatch = new Microsoft.Xna.Framework.Graphics.SpriteBatch(this.GraphicsDevice);
        base.LoadContent();
    }
    protected override void Update(Microsoft.Xna.Framework.GameTime GameTime)
    {
        System.Console.WriteLine(GameTime.IsRunningSlowly);
        Microsoft.Xna.Framework.Input.KeyboardState Keyboard = Microsoft.Xna.Framework.Input.Keyboard.GetState();
        if (Keyboard.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Escape)) this.Exit();
        base.Update(GameTime);
    }
    protected override void Draw(Microsoft.Xna.Framework.GameTime gameTime)
    {
        GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.CornflowerBlue);
        base.Draw(gameTime);
    }

    #endregion
    #region Variables

    private Microsoft.Xna.Framework.GraphicsDeviceManager GraphicsManager { get; set; }
    private Microsoft.Xna.Framework.Graphics.SpriteBatch SpriteBatch { get; set; }

    #endregion
}

2 个答案:

答案 0 :(得分:7)

我会尝试回答这个问题,而不是张贴“这就是它是怎么回事”。 XNA线程在失去焦点时会休眠。它是在XNA的游戏类中配置的。

InactiveSleepTime = new TimeSpan(0);

默认设置为20ms,将其设置为0将使XNA在失去焦点时全速运行。

IsRunningSlowly设置为true,因为帧速率低于60(这是设置IsFixedTimeStep时的默认值)

答案 1 :(得分:2)

这是设计的。游戏是最耗费资源的应用程序之一,所以当然XNA框架开发人员认为,当游戏不是焦点时,丢弃一些帧以保存一些CPU用于其他可能要执行的操作可能是一个好主意而游戏是在后台。

当XNA游戏的主窗口最小化时,它也不会进行Draw次调用。我相信Update来电永远不会掉线(虽然我可能错了)。