每天一个面试题(前端)-Canvas绘制的机制

1 阅读1分钟

如果面试官问你 “ Canvas绘制是实时的吗? ” ,你会怎么回答?

直接给出辩证回答:Canvas的绘制在数据层面是同步的,在屏幕显示层面是异步的。

如果不是专门做Canvas的,面试官一般不会追问很深。

若面试官继续追问,则见招拆招。

下面我一层层地解析深层的问题:

1. ” 为什么屏幕不是实时的? “

因为屏幕更新是批处理的

浏览器不会在执行完每一行绘图代码后立刻去刷新屏幕像素。

若这么做,性能会崩溃。

浏览器会将渲染任务挂起,等到当前执行栈和微任务全部执行完毕后,在Event Loop渲染阶段,统一将最新的Canvas位图提交给GPU,最终合成在显示屏上。

2. “ 如何做动画才能看起来‘实时’? ”

使用rAF(requestAnimationFrame)。

rAF的回调函数会在浏览器下一次重绘之前执行,能保证Canvas的绘制逻辑与显示器的刷新频率完美同步,这样就能实现‘视觉实时’。

3. “ 讲一讲Canvas性能优化 ”

解决主线程阻塞问题:用OffscreenCanvas,它可以让我们在Web Worker中进行Canvas绘制,完全解耦主线程。

解决绘制复杂图形过程中的闪烁问题:用双缓存/离屏渲染技巧,在内存中创建一个不可见的Canvas进行“草稿”绘制,完成后通过一次drawImage瞬间拷贝到屏幕上的Canvas中。