我认为我们的代码需要大约16ms的执行时间,因为渲染速率为60 fps,所以1000/60 =〜16ms。但是,如果我在Chrome中运行它:
requestIdleCallback((deadline)=>{
console.log(deadline.timeRemaining(), deadline.didTimeout)
});
timeRemaining
给了我49.9ms
的时间。这是否意味着Chrome不会每16毫秒重新渲染一次?我认为在这种情况下是真的,如果没有任何变化,则无需重新渲染。
答案 0 :(得分:3)
该规范支持您的假设。在Start an idle period algorithm中说:
- 让最后期限成为将来浏览器期望保持空闲状态的时间。用户代理应选择 deadline ,以确保即使从现在到 deadline 的整个时间段内都运行了回调,也不会延迟任何时间紧迫的任务。因此,应将其设置为最小值:通过setTimeout和setInterval设置的活动计时器列表中最接近的超时;通过requestAnimationFrame发布的待处理动画回调的计划运行时; 等待内部超时,例如开始渲染下一帧的截止日期,处理音频或用户代理认为重要的任何其他内部任务。
(我的重点)
因此,如果存在内部待处理超时以渲染下一帧,则截止日期必须在此之前。