概述将渲染与图像处理移至 Worker,可显著降低主线程阻塞。`OffscreenCanvas` 支持在 Worker 中使用 Canvas2D/WebGL 接口,配合 `ImageBitmap` 与 `transferControlToOffscreen` 构建高效的渲染管线。关键参数与概念`canvas.transferControlToOffscreen()`: 获取可在 Worker 中使用的 OffscreenCanvas 句柄。`createImageBitmap(blob)`: 高效解码图像并在 Worker/主线程间传递。Worker 与主线程消息:使用 `postMessage(..., [offscreen])` 进行可转移对象传递,避免拷贝。实践示例<canvas id="c" width="800" height="600"></canvas> <script> const worker = new Worker('./render.worker.js', { type: 'module' }) const offscreen = document.getElementById('c').transferControlToOffscreen() worker.postMessage({ type: 'init', canvas: offscreen }, [offscreen]) async function loadAndDraw(url) { const blob = await (await fetch(url)).blob() const bmp = await createImageBitmap(blob) worker.postMessage({ type: 'draw', image: bmp }, [bmp]) } loadAndDraw('/assets/large.jpg') </script> // render.worker.js self.canvas = null self.onmessage = (e) => { const { type } = e.data if (type === 'init') { self.canvas = e.data.canvas const ctx = self.canvas.getContext('2d') self.ctx = ctx } else if (type === 'draw') { const { image } = e.data self.ctx.clearRect(0, 0, self.canvas.width, self.canvas.height) self.ctx.drawImage(image, 0, 0) } } 验证方法使用 Performance 面板对比主线程任务排队时间(Task Blocking Time)与 FPS。测试大图片解码与滤镜处理(如卷积),观察交互流畅度改善。在不支持 OffscreenCanvas 的浏览器中回退至主线程渲染逻辑。注意事项在 Worker 中使用 2D/WebGL 时,避免频繁主线程-Worker 往返;尽可能批量传递命令或数据。合理使用可转移对象(OffscreenCanvas、ImageBitmap)以避免拷贝开销。处理内存占用与销毁(主动调用 `close()` 释放 Worker)。

发表评论 取消回复