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

在javascript中以毫秒为单位获取时间的更好方法?,javascript,Javascript,JavaScript中是否有其他方法可以使用date对象以毫秒为单位获取时间,或者至少有一种方法可以重用该对象,而不必每次需要获取该值时都实例化一个新对象?我问这个问题是因为我试图用JavaScript制作一个简单的游戏引擎,在计算“delta frame time”时,我必须每帧创建一个新的日期对象。虽然我不太担心这对性能的影响,但我对这个对象返回的确切时间的可靠性有一些问题 我在动画中每隔一秒左右就会出现一些奇怪的“跳跃”,我不确定这是否与JavaScript的垃圾收集有关,或者更新速度如此

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

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

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

prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;
计算运动/动画时,我将一个常量值乘以增量时间

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

编辑:我现在已经在不同的浏览器中测试了我的代码,这种“跳跃”似乎只在Chrome中出现,而不是在Firefox中。但如果有一种方法在两种浏览器中都能工作,那就更好了。

试试看


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

据我所知,您只能通过日期获得时间

Date.now是解决方案,但不适用于任何地方:

这将以毫秒为单位显示当前时间

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

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

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


编辑:从我的回答来看,
Date.now()
应该被认为是最好的选择,因为它在IE>=9上到处都受支持。

我知道这是一个非常古老的线程,但是为了保持最新和更相关,您可以使用更精确的功能在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 */
})();

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


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

如果您有日期对象,如

var date = new Date('2017/12/03');
然后,javascript中有一个内置方法,用于以毫秒格式获取日期,即valueOf()


我尝试过使用Date.now(),但仍然有相同的跳跃。所以现在我很确定这不是垃圾收集的问题,而是在使用Date对象获取精确值时的限制。正如我所说的,用常量值替换delta time会产生平滑的动画/转换,因此唯一可能发生的垃圾收集是使用“new Date”或“Date.now()”(如果此函数实例化自己不知道的对象).提醒一下:这在IE8和belowI中不起作用:/我想要的只是ms中的日期。对于如此必要的事情来说,似乎太复杂了。@Prozi+1。。IE真的很烂,当Im网络编程时,我真的不在乎IE,只在乎chrome和firefox………@TechLife你也应该给Android、Safari和opera浏览器一个思路,但我同意IE是一堆垃圾。我的意思是,MS已经放弃了,并且正在W10中实现一个新的浏览器。每帧一个对象与每秒跳跃的动画无关,这可能与
Date.getmillizes
只返回当前秒中的毫秒有关吗,即0到999?您在示例中没有使用此函数,但它可能正在其他地方或其他分支上使用?跳跃是否与某些奇怪的毫秒分辨率问题有关?来自:“当使用now()创建时间戳或唯一ID时,请记住在Windows上分辨率可能为15毫秒”。这可能与打嗝有关吗?@zashu这是很久以前的事了,所以我不记得这个例子的任何细节。但是对于最近的应用程序,当使用Date.now()时,我看不到更多的跳跃。
+
+new
中提供什么函数?
+
只需将
Date
转换为
Number
,以毫秒为单位给出标准的unix时间戳。你可以通过调用
(new Date())显式地得到这个值。getTime()
@mikenelson:对我来说并不可怕,当你知道强制是如何工作的时,这一点就很明显了。也就是说,
Date.now()
现在更受欢迎,因为它的支持已经足够大了。我更喜欢
+
而不是
.getTime()
。。。它更简单,我不需要记忆功能names@TravisJ很棒的捷径?要检索计算机中已经存在的数值,请创建一个对象,调用测试int的运算符并触发转换,该转换调用函数(valueOf),该函数调用类转换方法,该类转换方法调用最终检索该值的函数(getTime)。然后,对象被放弃到它的命运,在循环的1000次迭代之后,您有1000个delet
var date = new Date('2017/12/03');
date.valueOf(); //1512239400000 in milliseconds format