如果面试官问你 “ Canvas绘制是实时的吗? ” ,你会怎么回答?
直接给出辩证回答:Canvas的绘制在数据层面是同步的,在屏幕显示层面是异步的。
如果不是专门做Canvas的,面试官一般不会追问很深。
若面试官继续追问,则见招拆招。
下面我一层层地解析深层的问题:
1. ” 为什么屏幕不是实时的? “
因为屏幕更新是批处理的:
浏览器不会在执行完每一行绘图代码后立刻去刷新屏幕像素。
若这么做,性能会崩溃。
浏览器会将渲染任务挂起,等到当前执行栈和微任务全部执行完毕后,在Event Loop的渲染阶段,统一将最新的Canvas位图提交给GPU,最终合成在显示屏上。
2. “ 如何做动画才能看起来‘实时’? ”
使用rAF(requestAnimationFrame)。
rAF的回调函数会在浏览器下一次重绘之前执行,能保证Canvas的绘制逻辑与显示器的刷新频率完美同步,这样就能实现‘视觉实时’。
3. “ 讲一讲Canvas性能优化 ”
解决主线程阻塞问题:用OffscreenCanvas,它可以让我们在Web Worker中进行Canvas绘制,完全解耦主线程。
解决绘制复杂图形过程中的闪烁问题:用双缓存/离屏渲染技巧,在内存中创建一个不可见的Canvas进行“草稿”绘制,完成后通过一次drawImage瞬间拷贝到屏幕上的Canvas中。