在JavaScript中获取毫秒级时间的更好方法?

2020/11/17 16:22 · javascript ·  · 0评论

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

在动画中,我每秒大概会收到一些奇怪的“跳跃”,而且我不确定这是否与JavaScript的Garbage Collection或更新时的Date对象的限制有关。如果我将delta值设置为某个常数,那么动画就可以完全平滑,因此我可以肯定,这种“跳跃”与获取时间的方式有关。

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

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

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

如果无法避免使用Date对象获取以毫秒为单位的时间,则该函数将增加变量(即游戏开始以来经过的时间(以毫秒为单位)),然后使用SetTimer函数以每毫秒一次是有效且可靠的替代方法吗?

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

尝试Date.now()

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

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

据我所知,您只能在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上无处不在。

如果您有日期对象

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

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

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

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

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

本文地址:http://javascript.askforanswer.com/zaijavascriptzhonghuoquhaomiaojishijiandegenghaofangfa.html
文章标签:
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇: