我正在制作一个XNA游戏,是时候制作白天系统,为此我需要一些时钟。我尝试使用GameTime.TotalGameTime.Milliseconds == 0
将一秒钟添加到我的自定义时钟类的第二个计数器,但事实证明GameTime并不总是运行零毫秒。使用TimeSpan prevUpdate
与TotalGameTime.TotalSeconds
进行比较并不能提供足够的精确度,并且时间明显慢于实时时间。
我可以使用什么XNA或.Net组件来支持我的时钟,以便它不会花费太多资源或显着偏离实时?
答案 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
}