当窗口具有焦点时,XNA会拉扯

时间:2011-09-02 19:23:59

标签: c# xna lag

我正在开发使用XNA 3.1的xna游戏研究,我注意到一些游戏存在问题,尽管系统有足够的资源来处理它们,但它们仍然滞后,以及处理器使用率无法解释的过多。当来自游戏的窗口处于焦点时,过程#1(在任务管理器中)进入100%使用,并且游戏显示出轻微滞后的迹象(当声音效果按顺序重复时很明显)。当游戏失去窗口焦点时,它会继续实时绘制和更新,但是过程使用会减少,并且滞后会消失。

我已经用各种游戏对此进行了测试,结果保持不变,证明它与我的代码或代码效率无关。

这是一个与Xna 3.1隔离的问题,是否有解决方法?或者我只需要切换到4.0并希望我的游戏不使用任何不向后兼容的东西?

3 个答案:

答案 0 :(得分:0)

根据我的经验,XNA在聚焦时每秒运行高达60帧,在失焦时每秒约20帧。但是,如果您已设置IsFixedTimeStep = false;,则当流程处于焦点时,游戏将以尽可能快的速度运行。我的游戏在我的机器上以约500-700 fps的速度运行。这与发生的Update()次呼叫数相关联。所以我的游戏每秒也会更新500-700次。

我敢打赌,你已经禁用了固定的时间步长,而且大量的Update和Draw调用消耗了100%的核心,而且它正在搞乱你的音乐。如果它在那里,我建议删除行IsFixedTimeStep = false;。如果你的代码中不存在这一行,这不是问题,虽然我敢打赌你的Update或Draw正在做更多的工作。

在我自己的游戏中注意到这一点,我的更新循环中有一个Console.WriteLine语句(用于调试),这会导致很多延迟。

答案 1 :(得分:0)

XNA在窗口未对焦时添加睡眠! 前段时间我解决了这个问题,重写了Game类,并改变了Game类理解其形式是否有效的方式。

我不知道如何在没有使用代码修改Game类行为的情况下禁用此行为。

特别是,我前段时间发现的方式是一个真正的黑客\怪癖! 非常不干净的解决方案,但我发现的唯一方法。

public class MyGame
{
    private MethodInfo pActivate;

    public MyGame()
    {
        // We need to access base HostActivate method, that unfortunally, is private!
        // We need to use reflection then, of course this method is an hack and not a real solution!
        // Ask Microsoft for a better implementation of their class!

        this.pActivate = typeof(Game).GetMethod("HostActivated", BindingFlags.NonPublic | BindingFlags.Instance);
    }

    protected sealed override void OnDeactivated(object sender, EventArgs args)
    {
        base.OnDeactivated(sender, args);

        // Ok, the game form was deactivated, we need to make it believe the form was activated just after deactivation.

        if (!base.Active)
        {
            // Force activation by calling base.HostActivate private methods.
            this.pActivate.Invoke(this, new object[] { sender, args });
        }
    }
}

答案 2 :(得分:0)