在javascript中以毫秒为单位获得时间的更好方法?

时间:2011-02-02 12:22:17

标签: javascript

JavaScript中是否存在使用日期对象获取时间(以毫秒为单位)的替代方法,或者至少是重用该对象的方法,而不必在每次需要获取此值时都实例化新对象?我问这个是因为我试图在JavaScript中创建一个简单的游戏引擎,并且在计算“delta frame time”时,我必须每帧创建一个新的Date对象。虽然我并不太担心这种性能影响,但我对这个对象返回的确切时间的可靠性存在一些问题。

我在动画中得到一些奇怪的“跳跃”,每隔一秒左右,我不确定这是否与JavaScript的垃圾收集有关,或者在更新如此之快时限制了Date对象。如果我将delta值设置为某个常量,那么动画如果完全平滑,那么我很确定这个“跳跃”与我得到时间的方式有关。

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

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

计算移动/动画时,我将常数值乘以增量时间。

如果无法通过使用Date对象来避免以毫秒为单位获取时间,那么是一个增加变量的函数(自游戏开始以来经过的时间,以毫秒为单位),以及使用SetTimer函数调用的函数每毫秒一次的速率是一种有效可靠的替代方案吗?

编辑:我现在已经在不同的浏览器中测试了我的代码,看起来这种“跳跃”实际上只在Chrome中显而易见,而不是在Firefox中。但如果有一种方法在两种浏览器中都有效,那仍然会很好。

6 个答案:

答案 0 :(得分:152)

尝试Date.now()

跳过很可能是由于垃圾收集造成的。通常可以通过尽可能多地重用变量来避免垃圾收集,但我不能具体说明可以使用哪些方法来减少垃圾收集暂停。

答案 1 :(得分:44)

据我所知,你只能抽出时间 Date

Date.now 是解决方案,但无法在任何地方使用:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now

var currentTime = +new Date();

这为您提供当前时间(以毫秒为单位)。

对于跳转。如果您根据增量帧时间正确计算插值,并且您没有舍入数字错误,我会打赌垃圾收集器( GC)。

如果你的循环中有很多创建的临时对象,垃圾收集必须锁定线程以进行一些清理和内存重组。

使用Chrome,您可以查看GC在时间轴面板中花费的时间。

编辑:由于我的答案,Date.now()应被视为最佳选择,因为它在任何地方都受到支持,并且在IE> = 9上。

答案 2 :(得分:42)

我知道这是一个非常古老的主题,但为了使事情保持最新且更具相关性,您可以使用更准确的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 */
})();

答案 3 :(得分:3)

如果您有日期对象,如

var date = new Date('2017/12/03');

然后在javascript中有内置方法,以毫秒格式获取日期, valueOf()

date.valueOf(); //1512239400000 in milliseconds format

答案 4 :(得分:1)

这是一个非常古老的问题 - 但如果其他人正在研究它仍然需要参考 - requestAnimationFrame()是在现代浏览器中处理动画的正确方法:

更新:mozilla链接显示了如何执行此操作 - 我不想重复链接后面的文本;)

答案 5 :(得分:-2)

最好的方式和最短的回音方式

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