Javascript requestAnimationFrame()回调中的奇怪时间值
Javascript requestAnimationFrame()回调中的奇怪时间值,javascript,requestanimationframe,Javascript,Requestanimationframe,const prev=performance.now(); requestAnimationFrame(现在=>console.log(现在-prev))之所以发生这种情况,是因为您请求在当前帧和下一次重新绘制之间播放动画,但实际上可能错过了当前帧的第一个回调触发器,而当前帧是在timestamp参数建立时触发的 许多对requestAnimationFrame回调的调用可能在此时间跨度内发生,但所有调用都将具有活动帧中第一个requestsAnimationFrame回调触发器的timesta
const prev=performance.now();
requestAnimationFrame(现在=>console.log(现在-prev))代码>之所以发生这种情况,是因为您请求在当前帧和下一次重新绘制之间播放动画,但实际上可能错过了当前帧的第一个回调触发器,而当前帧是在timestamp
参数建立时触发的
许多对requestAnimationFrame
回调的调用可能在此时间跨度内发生,但所有调用都将具有活动帧中第一个requestsAnimationFrame
回调触发器的timestamp
,该触发器可能在调用performance.now()之前发生
还指出:
回调函数只传递一个参数,即
DOMHighResTimeStamp与performance.now()返回的类似,
指示requestAnimationFrame()开始时的时间点
执行回调函数
好的,那是iOS上的Safari。在我的电脑上,它对Chrome真的是负面的。但对Edge(基于Chromium的)和Firefox来说都是积极的。对于我(Chromium)来说,在不同的运行中,它从积极到消极都是不同的。至于原因,似乎只是时间不准确。From:“必须记住,为了缓解潜在的安全威胁,如Spectre,浏览器通常会将返回值舍入一定数量,以减少可预测性。这会限制计时器的分辨率或精度,从而固有地引入一定程度的不准确度。”稳定,但较旧(86.0.4240.111,希望更新). 这种效果可能有一些解释,当requestAnimationFrame()排队的多个回调在单个帧中开始触发时,每个回调都会收到相同的时间戳,即使在计算每个前一个回调的工作负载(MDN,requestAnimationFrame)时时间已经过去,因此时间戳有一定的解释空间。。。。。。需要记住的是,为了缓解潜在的安全威胁(如Spectre),浏览器通常会将返回值取整一定量,以降低可预测性。这会限制计时器的分辨率或精度,从而导致一定程度的不准确性。(MDN,performance.now)-所以它有一些故意的错误。(哦,我看到这个已经发布了),但是我在控制台上运行这两行,就像没有其他JS的站点一样……你的动画帧请求可能在这个时间的中间,或者在下一次重画之前,所以<代码>时间戳<代码>(你的代码>现在/代码>变量)可能过时,因为它实际上是由当前帧的requestAnimationFrame
触发的第一次回调的时间戳,您甚至没有机会捕捉到它。但是,由于在requestAnimationFrame
回调中没有对回调进行排队,所以最早的动画帧必须晚于排队。肯定还有更多的事情发生…重新绘制发生在JS任务完成后,但不是在任务期间!如果我理解正确,一组回调的DOMHighResTimeStamp将是第一次回调的开始时间,并且它不能小于第一次回调的调度时间或performance.now()代码>在调度之前调用。