【第4章 图像与视频】4.4 离屏 canvas

article/2025/9/5 9:52:57

文章目录

  • 前言
  • 为什么要使用 offscreenCanvas
  • 为什么要使用 OffscreenCanvas
  • 如何使用 OffscreenCanvas
    • 第一种使用方式
    • 第二种使用方式
  • 计算时长超过多长时间适合用Web Worker


前言

在 Canvas 开发中,我们经常需要处理复杂的图形和动画,这些操作可能会影响页面的性能和用户体验。为了解决这个问题,现代浏览器引入了 OffscreenCanvas 接口,它允许我们在后台线程(Web Workers)中进行画布操作,从而提高性能和响应速度。


为什么要使用 offscreenCanvas

OffscreenCanvas 是 HTML5 Canvas API 的扩展,它允许在独立的后台线程中执行画布操作,而不会阻塞主线程。这对于处理大型图像、复杂的绘图或者动画非常有用。


为什么要使用 OffscreenCanvas

传统的 Canvas 操作通常是在主线程中执行的,这可能会导致页面在复杂的绘图任务中出现卡顿或者延迟。使用 OffscreenCanvas 可以将这些操作移到后台线程中,这样可以避免阻塞主线程,提升整体的性能和响应速度。


如何使用 OffscreenCanvas

第一种使用方式

transferControlToOffscreen() 将控制转移到一个在主线程或者 web worker 的 OffscreenCanvas 对象上。并且在这个OffscreenCanvas上进行绘制的同时,也会在原始的canvas元素上进行绘制。

/* 主线程 */
const canvas = document.getElementById('mainCanvas')
const offscreen = canvas.transferControlToOffscreen()
const worker = new Worker('worker.js')// 将 OffscreenCanvas 传递给 Worker
worker.postMessage({ canvas: offscreen }, [offscreen])
/* worker线程 */
self.onmessage = function (event) {const offscreenCanvas = event.data.canvasconst ctx = offscreenCanvas.getContext('2d')// 绘制内容ctx.fillStyle = 'red'ctx.fillRect(50, 50, 200, 200)
}

第二种使用方式

/* 主线程 */
const canvas = document.getElementById('mainCanvas')
const ctx = canvas.getContext('2d')const worker = new Worker('./worker2.js')
worker.postMessage({ msg: 'init' })
worker.onmessage = function (e) {// 这里就接受到work 传来的离屏canvas位图ctx.drawImage(e.data.imageBitmap, 0, 0)
}ctx.arc(100, 75, 50, 0, 2 * Math.PI)
ctx.stroke()
/* worker线程 */
let offscreen, ctxfunction init() {offscreen = new OffscreenCanvas(512, 512)ctx = offscreen.getContext('2d')
}
// 绘制图形
function draw() {ctx.clearRect(0, 0, offscreen.width, offscreen.height)for (var i = 0; i < 10000; i++) {for (var j = 0; j < 1000; j++) {ctx.fillRect(i * 3, j * 3, 2, 2)}}const imageBitmap = offscreen.transferToImageBitmap()// 传送给主线程self.postMessage({ imageBitmap }, [imageBitmap])
}// 监听主线程发的信息
self.onmessage = function (e) {if (e.data.msg == 'init') {init()draw()}
}

计算时长超过多长时间适合用Web Worker

原则上,运算时间超过50ms会造成页面卡顿,属于Long task,这种情况就可以考虑使用Web Worker,但还要先考虑通信时长的问题,假如一个运算执行时长为100ms, 但是通信时长为300ms, 用了Web Worker可能会更慢。

计算的运算时长 - 通信时长 > 50ms,推荐使用Web Worker。

通信时长:新建一个web worker时, 浏览器会加载对应的worker.js资源,下图中的Time是这个 js 资源的加载时长。
在这里插入图片描述


http://www.hkcw.cn/article/DVRnJprfFv.shtml

相关文章

长安链起链调用合约时docker ps没有容器的原因

在调用这个命令的时候&#xff0c;发现并没有出现官方预期的合约容器&#xff0c;这是因为我们在起链的时候没有选择用docker的虚拟环境&#xff0c;实际上这不影响后续的调用&#xff0c;如果想要达到官方的效果那么你只需要在起链的时候输入yes即可&#xff0c;如图三所示

表中如何插入数据!扩展技能边界

insert语句向表中添加行。认识命令就行&#xff0c;使用时可以问AI帮忙写。 一.按顺序插入行 向上次新建的天气表&#xff0c;插入行。 insert into weather values (1,北京, 1, 37, 0.55, 2025-05-12); --按顺序依次写 insert into weather values (2,上海, 10, 41, …

三轴云台之抗扰动技术篇

三轴云台的抗扰动技术是保障其在复杂动态环境下实现稳定拍摄的核心&#xff0c;其技术体系涵盖机械结构优化、传感器融合算法、控制策略设计及动态补偿机制等多个层面。 一、抗扰动技术核心原理 多轴解耦与独立控制 俯仰轴&#xff08;Pitch&#xff09;、横滚轴&#xff08…

财管4-债务资本成本普通股资本成本的估计

1.债务资本成本 1) 未来成本 2) 期望成本 3) 长期债务成本 2.税前债务资本成本估计 2.1 各种方法 适用方法适用条件到期收益率公司目前有上市发行的长期债券可比公司 虽然没有上市债券&#xff0c;但可以找到一个拥有可交易债券的可比公司作为参照物&#xff1b;使…

【25-cv-05935】Keith律所代理(绿色巴士图)版权维权案

绿色巴士版权图 案件号&#xff1a;25-cv-05935 立案时间&#xff1a;2025年5月28日 原告&#xff1a;Alena Pavluchenko d/b/a Ellen Paul Art 代理律所&#xff1a;Keith 原告介绍 原告是科德角海滨的一名艺术家&#xff0c;擅长以水彩、书法和浮木雕刻记录生活。她通过…

登山第二十三梯:有序点云平面快速分割——35Hz帧速前进

文章目录 一 摘要 二 资源 三 内容 一 摘要 3D 点云中的实时平面提取对于许多机器人应用至关重要。作者提出了一种新颖的算法&#xff0c;用于在从 Kinect 传感器等设备获得的有组织的点云中实时可靠地检测多个平面。通过在图像空间中将这样的点云均匀地划分为不重叠的点组&…

【聚焦国产8K全画幅摄像机应用】多图预警!

聚焦国产8K全画幅摄像机应用实战图&#xff1a; 博冠8K全画幅摄像机B1应用于2023中央广播电视总台春晚拍摄现场 博冠8K全画幅摄像机B1应用于2023中央广播电视总台春晚拍摄现场 ​​​​ 博冠8K全画幅摄像机B1拍摄2022北京冬奥会 博冠8K全画幅摄像机B1在某电视台节目制作现场进行…

专题|LSTM-XGBoost,ARMA-LSTM,LDA-LSTM黄金比特币价格混合预测,蔬菜包发放时空协同调配,知乎综艺评论情感时序洞察

全文链接&#xff1a;https://tecdat.cn/?p42305 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Jingwen Luo&#xff0c;Yuying Liu&#xff0c;Yiyuan Jiang 在数字化浪潮席卷各行各业的当下&#xff0c;数据已成为驱动决策的核心要素。作为数据科学工作者…

Vue 组件 - 指令

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue指令 目录 指令写法 自定义指令 简单封装指令 指令传递字符串 update事件 指令应用 指令实现轮播 指令函数简写 指令函数列表 bind inserted update componentUpdated unbind Vue3指令轮播 nextick 总结 指…

在Mathematica中求解带阻尼的波方程

考察偏微分方程 和初边值条件 这里主要示意一下&#xff0c;这个方程如何用Mathematica来求解以及在使用不同解法的时候&#xff0c;会遇到什么问题。 方法一&#xff1a;不额外附加边界条件 ClearAll[u, x, t, a, b, c, w, n];c 1; n 1; a 1; b 1; w 1;pde {D[u[t, x]…

Linux目录结构与命令基础与ls命令

目录结构 linux的目录结构是一个树形结构&#xff0c;只有一个根目录&#xff1a;/&#xff0c;所有文件都在他下面。 而win有多个根目录&#xff0c;每一个盘符都是一个根目录 在linux系统中&#xff0c;路径的层级关系使用“/”表示。而一般来说&#xff0c;开头的 /表示的…

13 接口自动化-框架封装之 csv 数据驱动封装和日志

文章目录 一、框架封装规则总结二、框架代码简单实现项目框架预览csv_util.py - 处理 csv 数据logger_util.py - 处理日志requests_util.py - 将请求封装在同一个方法中yaml_util.py - 处理 yaml 数据get_token.yml 文件-采用了csv数据驱动get_token.csv 文件get_token_error.c…

1Panel v2 首发体验(alpha)

前言 1Panel v2 也是期待已久了&#xff0c;今天来试试&#xff0c;这是一个 alpha 版本&#xff0c;不代表最终正式版品质&#x1f92a;。 体验 登录界面 登录页面的变化还是比较大的&#xff0c;不再像 v1 时挂几个大字&#xff0c;在视觉和交互体验上都有显著提升。 新版…

SAR ADC 比较器噪声分析(一)

SAR ADC的比较器是非常重要的模块,需要仔细设计。主要考虑比较器的以下指标: 1)失调电压 2)输入共模范围 3)比较器精度 4)传输延时 5)噪声 6)功耗 这里主要讲一下noise。 上图比较器的噪声分析,详情见本专栏中的《SAR ADC 的噪声考虑》的比较器噪声的相关描述。比较器噪声…

【大模型/MCP】MCP简介

一句话总结 如果你打算让 LLM 像人一样“随手”调用脚本、数据库、搜索引擎或 CI/CD 流水线&#xff0c;而又不想为每个工具分别写 REST 插件或轮询接口&#xff0c;那么把它们包进 MCP 服务器是当前最省心、延迟最低、可复用最高的做法——正因如此 OpenAI、Google DeepMind、…

日常--OBS+mediamtx实现本地RTMP推流环境搭建(详细图文)

文章目录 一&#xff0e;前言二&#xff0e;介绍1.OBS2.mediamtx 三&#xff0e;环境搭建1.安装1.安装mediamtx2.安装OBS 2.配置OBS3.开启推流4.测试拉流 四&#xff0e;总结 一&#xff0e;前言 最近博主更新了一些和实时摄像头内容视觉项目&#xff0c;有好多小伙伴私信我问…

2024 CKA模拟系统制作 | Step-By-Step | 12、创建多容器Pod

目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. 多容器 Pod 的理解 2. YAML 配置规范 3. 镜像版本控制 三、考点详细讲解 1. 多容器 Pod 的工作原理 2. 容器端口冲突处理 3. 资源隔离机制 四、实验环境搭建步骤 总结 免费获取题库配套 CKA_v…

江科大UART串口通讯hal库实现

hal库相关库函数 初始化结构体 typedef struct {uint32_t BaudRate; /*波特率设置*/uint32_t WordLength; /*字长设置*/uint32_t StopBits; /*停止位设置 */uint32_t Parity; /*奇偶校验位设置*/uint32…

基于本地知识库的政务问答智能体

1.项目背景&#xff1a; 近年来&#xff0c;国家大力推进 “数字政府”“智慧政务” 建设&#xff0c;《“十四五” 数字经济发展规划》《关于加强数字政府建设的指导意见》等政策文件明确提出&#xff0c;要运用新一代信息技术优化政务服务流程&#xff0c;推动政务服务从 “…

python面向对象

可调用对象的范围包括&#xff1a;用户定义的函数&#xff0c;匿名函数&#xff0c;内置函数和内置方法&#xff0c;类&#xff0c;在类中定义的方法&#xff0c;生成器函数&#xff0c;如果类实现了_call 方法&#xff0c;那么类的实例对象也是可调用对象。 1 变量 1.1 类属性…