在游戏循环中,每个人都使用System.nanoTime()
但是对于动画,某些东西的速度等,有些人使用System.currentTimeMillis()
,有些人使用System.nanoTime()
。我应该使用哪一个?
currentTimeMillis()
实际上是一个挂钟。调用起来非常便宜,但通常(这可能取决于 JVM 实现和硬件)不提供毫秒级粒度,并且容易受到漂移的影响,例如由于 CPU 内核电压。
nanoTime()
是一个精确的时钟,应该用于测量经过的时间。打电话会更昂贵,但只要你不是每秒做一百次,这在大局中应该无关紧要。
使用适合您目的的那个。您可以在热点虚拟机内部:时钟、计时器和调度事件 - 第一部分 - Windows 中阅读有关它的更多信息,其中总结了这一切:
如果您对测量绝对时间感兴趣,请始终使用 System.currentTimeMillis()。请注意,它的分辨率可能相当粗糙(尽管这在绝对时间中很少是一个问题。
如果您对测量/计算经过的时间感兴趣,请始终使用 System.nanoTime()。在大多数系统上,它将提供微秒量级的分辨率。但请注意,在某些平台上执行此调用也可能需要几微秒。
您应该使用适合您需求的任何一种。
你举的两个例子根本不同:
-
对于动画,您只需要满足屏幕刷新率的要求,该刷新率将低于每秒 100 次。 为此,毫秒时钟就可以了。 (超过50次左右的刷新一秒,一个典型的人无法分辨出区别。
-
对于游戏循环,你可以提出一个论点,即"公平"意味着你应该使时钟尽可能准确。 (我相信一些游戏玩家会提出这样的论点。 如果你接受这个论点,那么纳秒时钟更合适。
没有人可能真正1分辨出在游戏和其他主要目标是流畅人机交互的应用程序中使用毫秒或纳秒时钟之间的区别。
简而言之:没有"正确"的方法。
1 - 他们可能认为他们可以分辨,但它经不起严格的科学测试。