Col*_*tru 132 javascript
JavaScript中是否存在使用日期对象获取时间(以毫秒为单位)的替代方法,或者至少是重用该对象的方法,而不必在每次需要获取此值时都实例化新对象?我问这个是因为我试图在JavaScript中创建一个简单的游戏引擎,并且在计算"delta frame time"时,我必须每帧创建一个新的Date对象.虽然我并不太担心这种性能影响,但我对这个对象返回的确切时间的可靠性存在一些问题.
我在动画中得到一些奇怪的"跳跃",每隔一秒左右,我不确定这是否与JavaScript的垃圾收集或更新如此之快的Date对象的限制有关.如果我将delta值设置为某个常量,那么动画如果完全平滑,那么我很确定这个"跳跃"与我得到时间的方式有关.
我能给出的唯一相关代码是我计算增量时间的方式:
prevTime = curTime;
curTime = (new Date()).getTime();
deltaTime = curTime - prevTime;
Run Code Online (Sandbox Code Playgroud)
在计算运动/动画时,我将常数值乘以增量时间.
如果没有办法通过使用Date对象来避免以毫秒为单位获取时间,那么会增加一个变量的函数(自游戏开始以来经过的时间,以毫秒为单位),并使用SetTimer函数以一定的速率调用每毫秒一次是一个有效和可靠的替代方案吗?
编辑:我现在已经在不同的浏览器中测试了我的代码,似乎这种"跳跃"实际上只在Chrome中显而易见,而不是在Firefox中.但是,如果有一种方法在两种浏览器中都有效,那仍然会很好.
Joe*_*hts 162
试试Date.now().
跳过很可能是由于垃圾收集.通常可以通过尽可能多地重用变量来避免垃圾收集,但我不能具体说明可以使用哪些方法来减少垃圾收集暂停.
ngr*_*man 47
据我所知,你只能抽出约会时间.
Date.now是解决方案,但无处可用:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now.
var currentTime = +new Date();
Run Code Online (Sandbox Code Playgroud)
这为您提供当前时间(以毫秒为单位).
为了你的跳跃.如果根据增量帧时间正确计算插值并且没有一些舍入数字错误,我打赌垃圾收集器(GC).
如果循环中有很多创建的临时对象,垃圾收集必须锁定线程以进行一些清理和内存重组.
使用Chrome,您可以查看GC在时间轴面板中花费的时间.
编辑:由于我的答案,Date.now()应该被认为是最好的选择,因为它支持无处不在,IE> = 9.
Chr*_*een 47
我知道这是一个非常古老的线程,但为了使事情保持最新且更具相关性,您可以使用更准确的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 */
})();
Run Code Online (Sandbox Code Playgroud)
小智 6
如果您有日期对象
var date = new Date('2017/12/03');
Run Code Online (Sandbox Code Playgroud)
然后在javascript中有一个内置方法来获取毫秒格式的日期,该值是valueOf()
date.valueOf(); //1512239400000 in milliseconds format
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
141683 次 |
| 最近记录: |