如何在XNA中制作精确的时钟?

时间:2012-10-30 14:51:02

标签: c# xna clock

我正在制作一个XNA游戏,是时候制作白天系统,为此我需要一些时钟。我尝试使用GameTime.TotalGameTime.Milliseconds == 0将一秒钟添加到我的自定义时钟类的第二个计数器,但事实证明GameTime并不总是运行零毫秒。使用TimeSpan prevUpdateTotalGameTime.TotalSeconds进行比较并不能提供足够的精确度,并且时间明显慢于实时时间。

我可以使用什么XNA或.Net组件来支持我的时钟,以便它不会花费太多资源或显着偏离实时?

1 个答案:

答案 0 :(得分:3)

使用Stopwatch进行高精度计时(reference)。

使用XNA' GameTime进行渲染和帧到帧时序逻辑。 XNA的计时器不匹配"挂钟"准确的时间。它能够漂移,以便更好地与帧渲染对齐,为您提供更流畅的动画(这是由Game类提供的行为)。随着时间的推移,它会略微偏离实时,但对于大多数游戏而言,这不是问题。

使用DateTime准确测量更长的时间跨度(例如:分钟,小时)。


请注意,您不应该对Milliseconds == 0进行比较,因为您无法准确知道XNA何时会调用您的Update方法,因此您可以在一帧上拥有Milliseconds == 999,然后Milliseconds == 15下一个 - 绕过并跳过0,所以你的情况永远不会触发。

因此您需要确定计时器何时超过阈值。有很多方法可以做到这一点。您可以跟踪阈值(如果您跟踪某些"总计"时间有用),在每次触发后递增它。就个人而言,我更愿意像这样积累时间:

seconds += gameTime.ElapsedTime.TotalSeconds;
if(seconds > 1.0)
{
    seconds -= 1.0;
    DoSomething(); // Triggered each second
}