把 Canvas 放到 WebWorker 中去绘制?想都不敢想有多爽!

前端私教训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer 已帮助数百位同学拿到了中大厂 offer

前言

大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心~

最近项目中需要绘制一块画布,大致上样子如下,就是绘制一堆人名在 Canvas 上(实际业务比这个复杂)


大致代码如下


页面肯定不止只有 Canvas 的逻辑,就比如我在绘制画布后,想去计算 1-100 的数字总和


但是最终发现,绘制画布耗费了很多时间,差不多有 1s 的时间,并且堵塞了主进程的代码,导致了我后续的逻辑被堵住了,下图可以看到,我的 computedTotal 结果是在画布绘制完菜执行完的


所以绘制画布的耗时过长,阻塞了后续的同步代码逻辑,这是不合理的,我们需要做优化

Web Worker?(离屏 Canvas)

我们平时在遇到这类情况的时候,十有八九第一时间都会想到 Web Worker

但是问题来了:正常来说,Web Worker 中可获取不了 DOM,做不了画布绘制呀

估计会有人想:那我们可以把 Canvas 的 DOM 节点传入 Web Worker 中吗?

可以试试

我们先准备一个 worker.js 来存放 Web Worker 的代码


接着在 index.js 中把 Canvas 的 DOM 节点传过去


发现会报错,因为 postMessage 传数据的时候会进行深拷贝,而 DOM 节点无法被深拷贝


那么传上下文过去可以吗?也可以试试


可以发现,还是不行


canvas.transferControlToOffscreen

不得不说 JavaScript 是真的强大,早就为我们准备好了一个 API ,那就是 transferControlToOffscreen


有了这个 API ,我们就可以把 Canvas 的 DOM 节点以另一种方式传入 Web Worker 了!!!我们也能在 Web Worker 中去进行 Canvas 的绘制,进而优化主线程的代码执行效率!!

首先改造一下 drawSunshine,现在只需要传入 Canvas DOM,不需要在主线程去做绘制


接着我们在 worker.js 中去接收 DOM 节点,并进行画布绘制




最终可以看到,Canvas 的绘制并不会阻塞后续逻辑的执行




结语

我是林三心,感谢您的阅读~

1v1私教、找工作、全程陪跑、终身服务

推荐一个非常靠谱的 Sunday 老师目前在做一个【1v1前端私教训练营】主打的就是:1v1 私教,终身辅导,帮大家拿到满意的 offer 点击这里即可查看详情

可直接加 Sunday老师 微信沟通,回复【资料】可直接领取 Sunday独家整理 大厂面试题、大厂真实面经

相关推荐

  • 腾讯文档助力业务提效的100种玩法!TVP吐槽大会邀您来探索
  • 一文搞懂大模型!基础知识、 LLM 应用、 RAG 、 Agent 与未来发展
  • 3 秒极速删除 node_modules,无需第三方工具!
  • 封装WebSocket消息推送,干翻Ajax轮询方式
  • 北漂7年,归来仍是牛马
  • Mistral AI两连发:7B数学推理专用、Mamba2架构代码大模型
  • CCL2024持续注册 | 第二十三届中国计算语言大会全日程公开
  • PyTorch团队首发技术路线图,近百页文档披露2024下半年发展方向
  • [开源]一款企业级的报表系统,支持在线设计报表,可视化生成报表
  • 分享一次 ShardingJDBC 亿级数据分表真实经验
  • 要重视!!!PLC通讯慢影响很很很大大大
  • 只需要3步!!!浏览器管理Redis
  • 5.5K Star颜值爆表!!!Redis官方出品客户端
  • Spring Boot集成kudu快速入门Demo
  • Mistral 又悄无无声息搞了个大的,发布了 MathΣtral 数学模型
  • 10 万卡集群:通往 AGI 的新门票
  • 随手拍就能出单赚钱的项目,适合普通人开启从0-1
  • 11款常用的Python虚拟环境管理器,最受推崇的居然是最后一个
  • JUC 包中的 Atomic 原子类总结
  • 转转上门履约服务拆分库表迁移实践