1

我在 XNA 4.0 中的计时、用 C# 编写和使用 Visual Studio 2010 express 时遇到问题。

我并没有完全写游戏,但我正在尝试使用 XNA 来简化内容管道、绘图和计时。我想要做的是编写一个程序,该程序可以以非常精细的分辨率计时用户对屏幕刺激的响应——理想情况下小于 5 毫秒。

为此,我需要至少每 5 毫秒调用一次更新例程(以便我可以轮询键盘)。即使在可变步长计时中,每次调用我也无法获得低于约 16 毫秒的计时。这似乎与我在更新和绘制例程中所做的处理量无关。我可以注释掉这两个例程中的所有内容,并且程序在每次迭代中仍然花费大约 16.66 毫秒。

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

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

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

4

2 回答 2

2

您遇到的问题是由于 VSync。通过将此行添加到游戏的构造函数(假设您有 default GraphicsDeviceManager graphics)在 XNA 中禁用它:

graphics.SynchronizeWithVerticalRetrace = false;

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

有关 XNA 中时序的描述,请参阅此博客文章

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

您希望将尽可能多的慢速操作(例如:更新和绘制)和阻塞操作(例如:vsync)移出主线程。请注意,XNA 中的输入只能在主线程上处理。我认为您可以在单独的线程上创建图形设备 - 尽管我从未尝试过。

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

于 2012-07-27T10:06:13.017 回答
-1

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

当你有很多处理时,使用多线程编程,,

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

希望我能帮助你...

于 2012-07-27T08:57:42.933 回答