XNA работает медленно, когда фокус удален

Мне просто интересно, при создании игры я заметил, что значение GameTime для IsRunningSlowly возвращает false, когда моя игра имеет фокус (как и должно быть), но когда я меняю приложения, оно меняется на true. Я даже создал пустую игру, и даже когда она теряет фокус, значение GameTime для IsRunningSlowly также возвращает значение 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
}

person Tyler Wiebe    schedule 22.02.2013    source источник


Ответы (2)


Я постараюсь ответить на вопрос, а не писать "это так". Поток XNA приостанавливается, когда теряет фокус. Он настраивается в игровом классе XNA.

InactiveSleepTime = new TimeSpan(0);

По умолчанию для него установлено значение 20 мс, а если установить его на 0, XNA будет работать на полной скорости, даже если он потерял фокус.

Для IsRunningSlowly устанавливается значение true, поскольку частота кадров падает ниже 60 (это значение по умолчанию, когда установлено значение IsFixedTimeStep).

person user2997658    schedule 15.11.2013

Это по дизайну. Игры являются одним из наиболее ресурсоемких видов приложений, поэтому, естественно, разработчики платформы XNA решили, что было бы неплохо пропускать некоторые кадры, когда игра не в фокусе, чтобы сохранить часть ЦП для других операций, которые вы, возможно, захотите выполнить. пока игра в фоновом режиме.

Игра XNA также не выполняет вызовы Draw, когда ее главное окно свернуто. Я считаю, что вызовы Update никогда не сбрасываются (хотя я могу ошибаться).

person user1306322    schedule 22.02.2013
comment
Кажется, что Update сбрасывается при перемещении или изменении размера окна. (В настоящее время я борюсь с этой проблемой - еще не проверил ее на 100%.) - person Andrew Russell; 23.02.2013
comment
@AndrewRussell да, я сталкивался с этой функцией раньше. Кажется, что игра сбрасывает все вызовы Update при перемещении и изменении размера окна игры. Не могу сказать, что это большая проблема для меня, но это может стать в будущем, когда я добавлю поддержку многопользовательской игры и тайм-аут соединения для надежности. Я предполагаю, что этому можно противодействовать (в худшем случае) запуском игры в приложении-оболочке, поскольку я надеюсь, что родительское окно не будет перенаправлять вызовы изменения размера/перемещения в свое дочернее игровое окно. Также вы можете попробовать неигровое окно для изменения размера и перемещения и игровое окно без полей (настоящее), которое автоматически подгоняется под него. - person user1306322; 23.02.2013
comment
Ммм - в значительной степени именно та проблема, которая у меня возникла. Он перестает передавать сетевые события и десинхронизирует сетевое время. Самый раздражающий. Кажется, дело в win32 (хорошее описание). - person Andrew Russell; 23.02.2013