服务端阅读 05月29日 01:55
Canvas 动画怎么实现?如何优化性能?
Canvas 动画本质是逐帧重绘:每帧调用 requestAnimationFrame 回调,在其中更新状态、清除画布、重绘所有元素,浏览器按刷新率(通常 60fps)将帧提交到屏幕。性能优化的核心思路是减少每帧的计算量和绘制量:用 OffscreenCanvas + Worker 将计算和预渲染移到后台线程;用对象池复用粒子避免 GC 压力;用脏矩形只重绘变化区域;分层 Canvas 将静态背景和动态前景分离;批量绘制减少状态切换。追问requestAnimationFrame 和 setInterval 做动画有什么本质区别?OffscreenCanvas 在 Worker 中如何与主线程 Canvas 同步?对象池模式怎么实现?复用对象时要注意清理哪些字段?什么是脏矩形优化?在什么场景下效果明显?分层 Canvas 的代价是什么?层太多反而更慢吗?写段代码// 离屏预渲染 + requestAnimationFrameconst offscreen = new OffscreenCanvas(60, 60)const offCtx = offscreen.getContext('2d')offCtx.fillStyle = 'coral'offCtx.beginPath()offCtx.arc(30, 30, 25, 0, Math.PI * 2)offCtx.fill()let x = 0function animate() { ctx.clearRect(0, 0, canvas.width, canvas.height) ctx.drawImage(offscreen, x, 100) x = (x + 2) % canvas.width requestAnimationFrame(animate)}animate()