JavaScript中是否存在使用日期对象获取时间(以毫秒为单位)的替代方法,或者至少是重用该对象的方法,而不必在每次需要获取此值时都实例化新对象?我问这个是因为我试图在JavaScript中创建一个简单的游戏引擎,并且在计算“delta frame time”时,我必须每帧创建一个新的Date对象。虽然我并不太担心这种性能影响,但我对这个对象返回的确切时间的可靠性存在一些问题。
我在动画中得到一些奇怪的“跳跃”,每隔一秒左右,我不确定这是否与JavaScript的垃圾收集有关,或者在更新如此之快时限制了Date对象。如果我将delta值设置为某个常量,那么动画如果完全平滑,那么我很确定这个“跳跃”与我得到时间的方式有关。
我能给出的唯一相关代码就是我计算增量时间的方式:
prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;
计算移动/动画时,我将常数值乘以增量时间。
如果无法通过使用Date对象来避免以毫秒为单位获取时间,那么是一个增加变量的函数(自游戏开始以来经过的时间,以毫秒为单位),以及使用SetTimer函数调用的函数每毫秒一次的速率是一种有效可靠的替代方案吗?
编辑:我现在已经在不同的浏览器中测试了我的代码,看起来这种“跳跃”实际上只在Chrome中显而易见,而不是在Firefox中。但如果有一种方法在两种浏览器中都有效,那仍然会很好。
答案 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);