Accuracy Vs. Precision
我想知道的是在更新对象在游戏中的位置时应该使用System.currentTimeMillis()还是System.nanoTime()?他们的运动变化与自上次通话以来经过的时间成正比,我想尽可能地精确。
我已经读到不同操作系统之间存在一些严重的时间分辨率问题(即Mac / Linux的分辨率几乎为1毫秒,而Windows的分辨率为50毫秒?)。我主要是在Windows上运行我的应用,而50ms的分辨率似乎非常不准确。
是否有比我列出的两个更好的选择?
有什么建议/意见吗?
如果你只是在寻找经过时间的极其精确的度量,请使用System.nanoTime()。System.currentTimeMillis()会为你提供自该纪元以来最精确的经过时间(以毫秒为单位),但System.nanoTime()相对于任意点,你可以得到十亿分之一秒的精确时间。
System.nanoTime()
System.currentTimeMillis()
从Java文档中:
public static long nanoTime()
返回最精确的可用系统计时器的当前值,以纳秒为单位。
此方法只能用于测量经过时间,并且与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意的起始时间以来的纳秒(也许是将来的时间,因此值可能为负)。此方法提供纳秒精度,但不一定提供纳秒精度。无法保证值的更改频率。 由于数值上溢,跨越大约292年(2 63纳秒)的连续呼叫中的差异将无法准确计算经过的时间。
例如,要测量某些代码执行所需的时间:
long startTime = System.nanoTime(); // ... the code being measured ... long estimatedTime = System.nanoTime() - startTime;