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,输出)
一个正方形沿着屏幕移动,这就是 Chrome 开发工具的方式
时间线看起来:
https://i.stack.imgur.com/QqrW5.jpg
据我了解,垂直的灰色虚线是当前帧的结束和下一帧的开始。在屏幕截图中,我们有一个 19.3 毫秒的帧,其中浏览器几乎不执行任何操作(大量空闲时间)。如果浏览器在框架启动时就运行所有代码,难道它不能避免这种情况吗?
然而,如果我绘制正方形 500 次,CPU 速度会减慢 6 倍
(https://jsbin.com/yecowob/4/edit?js,输出),我得到时期
浏览器正是我想要的(开始运行代码作为框架
开始),但它再次不同步:
https://i.stack.imgur.com/vjJrW.jpg
当它开始在虚线上运行时,fps 更加平滑,但只有当浏览器有一些繁重的工作要做时我才能让它工作。
那么为什么 requestAnimationFrame() 不是每次都在帧开始时触发,我怎样才能让它这样做呢?
非常感谢您在这方面给我的任何帮助。