Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript requestAnimationFrame()回调中的奇怪时间值_Javascript_Requestanimationframe - Fatal编程技术网

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()在调度之前调用。