同时创建 ImageBitmap 的 API: createImageBitmap 方法同时存在 windows 和 workers 中. 它接受各种不同的图像来源 。 例如它可以处理我们最常使用的 HTMLImageElement 对象 。
这里我以 ImageBitmap 为例构建 Web Worker 部分代码:
// main.work.tsasync function getCanvasBlob(bitmap: ImageBitmap): Promise<Blob> { const canvas = new OffscreenCanvas(bitmap.width bitmap.height) const ctx = canvas.getContext('2d') as OffscreenCanvasRenderingContext2D ctx.drawImage(bitmap 0 0) // do sth return await canvas.convertToBlob()
这部分代码目的在于取代主线程中创建的 HTMLCanvasElement 对象 , 更换为 Web Worker 中创建的 OffscreenCanvas 对象 。
【浏览器|浏览器多线程离屏渲染压缩打包方案】主线程只负责创建 ImageBitmap 和 ArrayBuffer 这类的 Transferable_objects 来和 Worker 进行数据通信 。
并最终 Worker 输出一个 ArrayBuffer 交给主线程组装二进制对象并进行浏览器下载行为 。
优雅的兼容性降级方案
方案主要存在 2 个可能不兼容的点:
OffscreenCanvas
OffscreenCanvas 除了 chormuim 内核的那一批浏览器(chrome.edge)支持较好之外 , 像 FFSafariie 均不支持 (意外的是 opera居然支持)
附
Web Worker
Web Worker 大部分都支持(包括 ie10+)不过各个浏览器支持的特性存在一些细小的差异 。
附
兼容标志位
// 是否支持 web workerexport const isSupportWorker = Boolean(window.Worker)// 是否支持 OffscreenCanvasexport const isSupportOffscreenCanvas = Boolean(window.OffscreenCanvas)
- 优先去除兼容性最差的OffscreenCanvas
- 次级去除 Web Worker 只使用Js主线程
方案总结
优点:
- 处理大体积图片的性能更优
- 不阻塞主js线程
- 兼容性差 需要降级方案
- 实现相比单线程版本较为复杂 , 心智负担较重 , 容易出bug
- 处理小图片可能不如主线程
- 不同浏览器性能差异较大 , 难以统一用户体验
相关经验推荐
- 高通骁龙|从3699跌至1899,价格腰斩后的老旗舰,比千元机强大很多
- 联想|不输多屏协同!联想小新平板悄悄上线新功能:能把电脑装进去
- 耳机|获多个“年度最佳”的国产降噪耳机,为何能备受媒体青睐?
- 3d打印机|轮到美国被卡脖子,中国掌握一项世界顶尖技术,西方给多少也不卖
- 佳能|佳能相机是稳定可靠的工具,用过的镜头不太多,但没让我失望过
- 鼠标|电脑桌面怎样分屏显示?原来方法这么简单,可惜很多人都不知道
- OPPO|拿奖拿到手软!揽获多项“年度最佳”,OPPO Enco Free2系列稳了
- 雷蛇|搭载诸多顶尖配置,iQOO 9给游戏体验加buff
- sim卡|你熟悉的手机SIM卡,可能活不了多久了
- 爱普生|爱普生L6498墨仓式多功能一体机,刷新商用办公新体验
