当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2024-07-19 07:59:00 258观看
导读前言大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心!最近项目中需要绘制一块画布,大致上样子如下,就是绘制一堆人名在 Canvas 上(实际业务比这个复杂)。图片大致代码如下:页面肯定

前言

大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心!nuc28资讯网——每日最新资讯28at.com

最近项目中需要绘制一块画布,大致上样子如下,就是绘制一堆人名在 Canvas 上(实际业务比这个复杂)。nuc28资讯网——每日最新资讯28at.com

图片图片nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

大致代码如下:nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

页面肯定不止只有 Canvas 的逻辑,就比如我在绘制画布后,想去计算 1-100 的数字总和。nuc28资讯网——每日最新资讯28at.com

图片图片nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

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

图片图片nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

所以绘制画布的耗时过长,阻塞了后续的同步代码逻辑,这是不合理的,我们需要做优化。nuc28资讯网——每日最新资讯28at.com

Web Worker?(离屏 Canvas)

我们平时在遇到这类情况的时候,十有八九第一时间都会想到 Web Worker。nuc28资讯网——每日最新资讯28at.com

但是问题来了:正常来说,Web Worker 中可获取不了 DOM,做不了画布绘制呀。nuc28资讯网——每日最新资讯28at.com

估计会有人想:那我们可以把 Canvas 的 DOM 节点传入 Web Worker 中吗?nuc28资讯网——每日最新资讯28at.com

可以试试!nuc28资讯网——每日最新资讯28at.com

我们先准备一个 worker.js 来存放 Web Worker 的代码:nuc28资讯网——每日最新资讯28at.com

图片图片nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

接着在 index.js 中把 Canvas 的 DOM 节点传过去。nuc28资讯网——每日最新资讯28at.com

图片图片nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

发现会报错,因为 postMessage 传数据的时候会进行深拷贝,而 DOM 节点无法被深拷贝。nuc28资讯网——每日最新资讯28at.com

图片nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

那么传上下文过去可以吗?也可以试试!nuc28资讯网——每日最新资讯28at.com

图片图片nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

可以发现,还是不行。nuc28资讯网——每日最新资讯28at.com

图片图片nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

canvas.transferControlToOffscreen

不得不说 JavaScript 是真的强大,早就为我们准备好了一个 API ,那就是 transferControlToOffscreen。nuc28资讯网——每日最新资讯28at.com

图片图片nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

有了这个 API ,我们就可以把 Canvas 的 DOM 节点以另一种方式传入 Web Worker 了!!!我们也能在 Web Worker 中去进行 Canvas 的绘制,进而优化主线程的代码执行效率!!nuc28资讯网——每日最新资讯28at.com

首先改造一下 drawSunshine,现在只需要传入 Canvas DOM,不需要在主线程去做绘制。nuc28资讯网——每日最新资讯28at.com

图片图片nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

接着我们在 worker.js 中去接收 DOM 节点,并进行画布绘制。nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

图片图片nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

最终可以看到,Canvas 的绘制并不会阻塞后续逻辑的执行。nuc28资讯网——每日最新资讯28at.com

nuc28资讯网——每日最新资讯28at.com

图片nuc28资讯网——每日最新资讯28at.com

图片 图片 nuc28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-101708-0.html把 Canvas 放到 WebWorker 中去绘制?想都不敢想有多爽!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python 中窗口操作的完整指南

下一篇: 轻盈高效:深入了解.NET中的ValueStopwatch计时器

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • Golang 中的 io 包详解:组合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是对Reader和Writer接口的组合,
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了“本地生活”入口,位置较深,位于首页的“充值中心”内,目前主要售卖美食相关的
  • 苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    集微网消息,据彭博社报道,在8月3日印度突然禁止在没有许可证的情况下向印度进口电脑/平板及显示器等产品后,苹果、三星电子和惠普等大公司暂停向印度
  • 华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    北京时间2月27日晚,华为在巴塞罗那举行春季智慧办公新品发布会,在海外市场推出之前已经在中国市场上市的笔记本、平板、激光打印机等办公产品,并首次推出搭载
Top