在游戏循环中,每个人都使用System.nanoTime()
,但对于某些内容,例如动画,某些内容的速度等等,某些人使用System.currentTimeMillis()
而某些人使用System.nanoTime()
。我应该使用哪一个?
答案 0 :(得分:4)
currentTimeMillis()
实际上是一个挂钟。调用非常便宜,但通常(这可能取决于JVM实现和硬件)不能提供毫秒级的粒度并且易于漂移,例如由于CPU核心电压。
nanoTime()
是一个精确的时钟,应该用于测量经过的时间。打电话会更贵,但只要你不是每秒钟做这一百次,那么从大局来看并不重要。
使用适合您目的的那个。您可以在Inside the Hotspot VM: Clocks, Timers and Scheduling Events - Part I - Windows中详细了解相关内容,其中总结了以下内容:
如果您对测量绝对时间感兴趣,请始终使用System.currentTimeMillis()。请注意,它的分辨率可能非常粗糙(尽管这绝对不是绝对时间的问题。)
如果您对测量/计算已用时间感兴趣,请始终使用System.nanoTime()。在大多数系统上,它将提供微秒级的分辨率。但请注意,此调用也可能需要几微秒才能在某些平台上执行。
答案 1 :(得分:1)
您应该使用适合您需求的任何一种。
您给出的两个例子根本不同:
对于动画,您只需满足屏幕刷新率的要求,即每秒100次以下。为此,毫秒钟就可以了。 (超过50左右刷新一秒,一个典型的人无法区分。)
对于游戏循环,您可以提出一个“公平”意味着您应该使时钟尽可能准确的论点。 (而且我确信一些游戏玩家会提出这个论点。)如果你接受这个论点,那么纳秒时钟更合适。
在游戏和其他主要目标是平滑的人机交互的其他应用程序中,没有人可能实际上 1 告诉使用毫秒或纳秒时钟之间的区别。
简而言之:没有“正确”的方式。
1 - 他们可能认为他们可以告诉他们,但它不会经受严格的科学测试。