我正在开发使用XNA 3.1的xna游戏研究,我注意到一些游戏存在问题,尽管系统有足够的资源来处理它们,但它们仍然滞后,以及处理器使用率无法解释的过多。当来自游戏的窗口处于焦点时,过程#1(在任务管理器中)进入100%使用,并且游戏显示出轻微滞后的迹象(当声音效果按顺序重复时很明显)。当游戏失去窗口焦点时,它会继续实时绘制和更新,但是过程使用会减少,并且滞后会消失。
我已经用各种游戏对此进行了测试,结果保持不变,证明它与我的代码或代码效率无关。
这是一个与Xna 3.1隔离的问题,是否有解决方法?或者我只需要切换到4.0并希望我的游戏不使用任何不向后兼容的东西?
答案 0 :(得分:0)
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)