更好的方式获得时间以毫秒为单位的JavaScript?

在JavaScript中有没有替代方法可以使用date对象以毫秒为单位获取时间,或者至less有一种方法可以重用该对象,而不必在每次需要获取此值时都实例化一个新对象? 我在问这个,因为我正在尝试在JavaScript中制作一个简单的游戏引擎,当计算“delta帧时间”时,我必须在每一帧都创build一个新的Date对象。 虽然我不担心这个对象的性能影响,但是我对这个对象返回的确切时间的可靠性有一些问题。

我每秒钟都会在animation中出现一些奇怪的“跳跃”,我不确定这是否与JavaScript的垃圾收集相关,或者在更新速度如此之快时与Date对象有关。 如果我把delta值设置成一些常量,那么animation如果完全平滑,那么我相当肯定这个“跳跃”与我获得时间的方式有关。

我能给出的唯一相关代码是我计算增量时间的方式:

prevTime = curTime; curTime = (new Date()).getTime(); deltaTime = curTime - prevTime; 

当计算运动/animation我乘以一个恒定的价值时间。

如果无法通过使用Date对象来避免以毫秒为单位获取时间,那么将增加一个variables的函数(即从游戏开始以来以毫秒为单位的经过时间),以及使用SetTimer函数以每一毫秒一次是一个有效和可靠的select?

编辑:我已经testing了我的代码在不同的浏览器,似乎这个“跳”实际上只在Chrome,而不是在Firefox。 但是,如果在这两种浏览器中都有一种方法,那还是不错的。

尝试Date.now() 。

跳过很可能是由于垃圾回收。 通常垃圾收集可以通过尽可能重用variables来避免,但是我不能特别说明可以使用哪些方法来减less垃圾收集暂停。

据我所知,你只能与Date相处。

Date.now是解决scheme,但无处可用: https : //developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now 。

 var currentTime = +new Date(); 

这将以毫秒为单位给出当前时间。

为了你的跳跃 。 如果根据增量帧时间正确地计算插值 ,并且没有舍入数字错误 ,我敢打赌垃圾收集器(GC)。

如果在循环中有很多创build的临时对象,垃圾收集必须locking线程才能进行一些清理和内存重新组织。

使用Chrome,您可以看到GC在“ 时间轴”面板中花费了多less时间。

编辑:因为我的答案, Date.now()应该被视为最好的select,因为它是支持无处不在,IE> = 9。

我知道这是一个非常古老的线程,但为了保持最新和更相关的东西,你可以使用更精确的performance.now()函数来获得更精细的谷歌时间在JavaScript中。

 window.performance = window.performance || {}; performance.now = (function() { return performance.now || performance.mozNow || performance.msNow || performance.oNow || performance.webkitNow || Date.now /*none found - fallback to browser default */ })(); 

这是一个非常古老的问题 – 但如果其他人正在查看它,仍然可以参考 – requestAnimationFrame()是在现代浏览器中处理animation的正确方法:

更新:Mozilla链接显示如何做到这一点 – 我不想重复链接后面的文本;)

最好的方式和最短的方式来回声

 var d = new Date(); var n = d.getTime(); alert (n);