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

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

每隔一秒左右,我就会在动画中看到一些奇怪的“跳跃”,我不确定这是否与 JavaScript 的垃圾收集有关,或者是因为 Date 对象在更新速度如此之快时受到了限制。如果我将 delta 值设置为某个常数,那么动画就会非常平滑,所以我相当肯定这个“跳跃”与我得到时间的方式有关。

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

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

在计算移动/动画时,我将一个常量值与增量时间相乘。

如果没有办法通过使用 Date 对象来避免以毫秒为单位的时间,那么增加一个变量(即自游戏开始以来以毫秒为单位的运行时间)并且以每毫秒一次的速度使用 SetTimer 函数来调用的函数是否是一个有效和可靠的替代方案呢?

编辑: 我现在已经在不同的浏览器中测试了我的代码,看起来这种“跳跃”只在 Chrome 中表现得很明显,而不是在 Firefox 中。但是,如果有一种方法可以同时在两种浏览器中工作,那就更好了。

189871 次浏览

试试 约会,现在()

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

据我所知,你只能得到与 日期的时间。

Now 是解决方案,但不是所有地方都可用: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now

var currentTime = +new Date();

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

你的 跳跃。如果根据 三角洲帧时间正确地计算 插值,并且没有一些 四舍五入误差,我打赌是垃圾收集器(GC)。

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

使用 Chrome,你可以看到 GC 在 时间线面板上花费了多少时间。

编辑: 因为我的回答,Date.now()应该被认为是最好的选择,因为它在 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()是在现代浏览器中处理动画的正确方法:

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

如果日期对象类似于

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

然后在 javascript 中有一个内置的方法来获取毫秒格式的日期,即 ValueOf ()

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