当前位置: 首页 > backend >正文

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

文章目录

  • 前言
  • 为什么要使用 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.xdnf.cn/news/9836.html

相关文章:

  • 前端开源JavaScrip库
  • uniapp+ts模拟popup弹出框(下拉框)
  • 【Kubernetes】ubuntu20.04通过kubeadm + Docker安装k8s
  • 进程间通信(共享内存)
  • Maven 仓库类型与镜像策略
  • aws instance store 的恢复
  • 【仿生系统】爱丽丝的“内在”或“灵魂”:概念与形式
  • C语言进阶--字符串+内存函数
  • R语言在生物群落数据统计分析与绘图中的实践应用
  • 【电拖自控】转速检测数字测速(脉冲计数测速)
  • SSH免密登录其它用户脚本
  • Hadoop MapReduce:大数据处理利器
  • 25 字符数组与字符串及多维数组详解:定义与初始化、访问与遍历、%s 格式符、内存剖析、编程实战
  • 什么是单片机?
  • Axure设计案例——科技感对比柱状图
  • 小白的进阶之路系列之五----人工智能从初步到精通pytorch张量
  • kibana解析Excel文件,生成mapping es导入Excel
  • Telegram平台分发其聊天机器人Grok
  • openfeignFeign 客户端禁用 SSL
  • 机顶盒CM311-5s纯手机免拆刷机,全网通,当贝桌面
  • 小表驱动大表更快吗,不是
  • RuoYi前后端分离框架集成手机短信验证码(一)之后端篇
  • 车载通信网络 --- 车载通信网络槪述
  • 计算机网络全维度解析:架构协议、关键设备、安全机制与新兴技术深度融合
  • Mysql中索引B+树、最左前缀匹配
  • LVS+KeepAlived
  • 【在线五子棋对战】一、项目简介 环境搭建
  • HTML实战:爱心图的实现
  • 本地Markdown开源知识库选型指南
  • 算法日记32:埃式筛、gcd和lcm、快速幂、乘法逆元