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

时间:2018-04-19 22:25:21

标签: java milliseconds nanotime

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

2 个答案:

答案 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 - 他们可能认为他们可以告诉他们,但它不会经受严格的科学测试。