var y = 0
canvas.height *= 5
ctx.fillStyle = 'green'
function update () {
requestAnimationFrame(update)
ctx.clearRect(0, 0, canvas.width, canvas.height)
ctx.fillRect(0, y, 300, 300)
y++
}
update()
对于这个简单的JSBin(https://jsbin.com/yecowob/edit?html,js,output),其中一个正方形沿着屏幕移动,这是Chrome开发工具时间轴的样子: 据我理解,垂直虚线是当前帧的结束和下一帧的开始。在屏幕截图中,我们有一个持续19.3毫秒的帧,浏览器几乎没有做任何事情(很多空闲时间)。如果浏览器在帧开始时立即运行所有代码,它不会遇到这种情况吗?
然而,如果我将正方形重复绘制500次,在6倍CPU减速(https://jsbin.com/yecowob/4/edit?js,output)时,有时浏览器会按照我希望的方式执行代码(在帧开始时开始运行),但之后又会失去同步: 当它开始在虚线上运行时,帧率更加流畅,但我只能在浏览器需要大量处理时才能使其起作用。那么为什么requestAnimationFrame()不会每次在帧的开头立即触发,我该如何做到这一点呢?非常感谢您对此提供的任何帮助。