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