2

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

我可以使用什么 XNA 或 .Net 组件来作为时钟的基础,这样它就不会花费太多资源或明显偏离实时?

4

1 回答 1

3

用于Stopwatch高精度计时(参考)。

使用 XNAGameTime进行渲染和帧到帧时序逻辑。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
}
于 2012-10-30T15:16:31.600 回答