使用XNA 4.0 Game类可以每秒更新超过60次吗?

时间:2012-07-27 02:52:18

标签: c# xna-4.0

我遇到了XNA 4.0中的计时问题,使用C#编写并使用Visual Studio 2010 express。

我不是在准确地编写游戏,但我正在尝试使用XNA来简化内容管道,绘图和计时。我正在尝试做的是编写一个程序,可以用非常精细的分辨率计算用户对屏幕上刺激的响应 - 理想情况下小于5毫秒。

要做到这一点,我需要每5毫秒调用一次更新例程(所以我可以轮询键盘)。即使在可变步进时序中,我也无法得到每次通话约16 ms以下的时序。这似乎与我在更新和绘制例程中执行的处理量无关。我可以在两个例程中注释掉所有内容,程序在每次迭代时仍会花费大约16.66 ms。

在固定步长计时中,我可以将目标设置为每秒约60次迭代(更新之间为16.66 ms),但如果我试图以更快的速度运行,则会触发IsRunningSlowly标志,并且游戏似乎尝试补偿 - 几次迭代将比每秒60次迭代运行得更快,然后1次迭代将运行得更慢。

所以我想我的问题是:每秒60次迭代是XNA的上限吗?有可能绕过它吗?我应该完全放弃XNA吗?

我非常感谢你的时间和知识。提前致谢。

2 个答案:

答案 0 :(得分:2)

您遇到的问题是由VSync引起的。通过将此行添加到游戏的构造函数中来禁用它(假设您具有默认的GraphicsDeviceManager graphics):

graphics.SynchronizeWithVerticalRetrace = false;

这将使您的游戏“尽可能快地”运行。这应该是“足够好”的。

有关XNA中的时序说明,请参阅this blog post

如果你想获得更多的幻想:对于Windows上的XNA,我会考虑直接使用Windows事件循环和高分辨率计时器。请注意,XNA中的Game(在Windows和Xbox 360上)完全是可选的。

你想要从主线程移动尽可能多的慢速操作(例如:更新和绘制)和阻塞操作(例如:vsync)。请注意,XNA中的输入只能在主线程上处理。我认为你可以在一个单独的线程上创建图形设备 - 虽然我从未尝试过它。

您应该注意,如果您正在测量反应时间,则向GPU发送“当前”命令与实际出现在屏幕上的内容之间存在滞后。

答案 1 :(得分:-1)

我不是XNA开发的专家,但是,我知道我已经在Windows手机中遇到了类似的“问题”。 (慢慢地问题)。

如果您需要进行大量治疗,请使用multithreading programming,

msdn:“使用多线程的应用程序对用户输入响应更快,因为当处理器密集型任务在不同的线程上执行时,用户界面保持活动状态。多线程在创建可伸缩应用程序时也很有用,因为您可以将线程添加为工作负载增加。“

希望我帮助你...