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

2022-08-30 02:36:15

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

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

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

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

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

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

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


答案 1

尝试 Date.now()

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


答案 2

据我所知,你只能和约会一起获得时间。

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

var currentTime = +new Date();

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

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

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

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

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