是 System.nanoTime();或 System.currentTimeMillis();更适合游戏

Is System.nanoTime(); or System.currentTimeMillis(); better for a game

在游戏循环中,每个人都使用 System.nanoTime(),但对于动画、某些东西的速度等,有些人使用 System.currentTimeMillis(),有些人使用 System.nanoTime()。我应该使用哪一个?

currentTimeMillis() 实际上是一个挂钟。它的调用成本非常低,但通常(这可能取决于 JVM 实现和硬件)不提供毫秒粒度并且容易发生漂移,例如由于 CPU 核心电压。

nanoTime() 是一个精确的时钟,应该用于测量经过的时间。调用会更昂贵,但只要您不是每秒执行此操作一百次,从大局来看应该无关紧要。

使用适合您目的的那个。您可以在 Inside the Hotspot VM: Clocks, Timers and Scheduling Events - Part I - Windows 中阅读更多相关信息,总结如下:

If you are interested in measuring absolute time then always use System.currentTimeMillis(). Be aware that its resolution may be quite coarse (though this is rarely an issue for absolute times.)

If you are interested in measuring/calculating elapsed time, then always use System.nanoTime(). On most systems it will give a resolution on the order of microseconds. Be aware though, this call can also take microseconds to execute on some platforms.

您应该使用适合您需要的那个。

你给出的两个例子根本不同:

  • 动画只要满足屏幕刷新率要求,每秒100次以内即可。为此,毫秒时钟就可以了。 (超过 50 次左右刷新一秒,一般人无法区分。)

  • 对于游戏循环,您可以提出一个论点,即 "fairness" 意味着您应该使时钟尽可能准确。 (我相信有些游戏玩家会提出这样的论点。)如果你接受这个论点,那么纳秒时钟更合适。

没有人可能真正1 区分在游戏和其他主要目标是流畅的人机交互的应用程序中使用毫秒或纳秒时钟之间的区别。

简而言之:没有 "right" 方法。


1 - 他们可能认为他们可以说,但经不起严格的科学测试。