tech share
  • tech-share
  • Engineering
    • 登录鉴权
    • SSR 页面路由
    • npm 版本号
    • 缓存
    • 数据库容灾
    • 动态效果导出 gif
    • Chrome-devtools
    • C 端 H5 性能优化
    • Docker
    • Monorepo 最佳实践
    • 技术架构演化
    • 项目规范最佳实践
    • snowpack
    • 静态资源重试
    • 前端页面渲染分析
    • Git
    • 前端重构
    • 微前端
    • 项目依赖分析
    • 前端监控原理
    • webpack
    • BS 架构与 CS 架构
    • HTTPS
    • package-lock.json 生成逻辑
    • SVN(Subversion)
    • 数据库分类
    • gulp
    • 前端架构
    • Bundle & Bundless
    • 控制反转 IoC
  • JavaScript
    • Javascript 性能
    • JavaScript 原型(2) - 原型与原型链
    • JavaScript 原型(1) - 构造函数
    • JavaScript - Promise
    • ES6 解构赋值
    • 前端离线化
    • Proxy
    • Object.defineProperty()简介
    • TypeScript
  • MachineLearning
    • GAN生成对抗网络
    • 虚拟对抗训练
    • 深度度量学习
    • 原型网络
    • PyTorch优化器
    • 隐马尔可夫模型2
    • Shapley Value 算法
    • Embarassingly Autoencoder算法
    • AutoRec算法及其后续发展
    • 深度学习常用激活函数
    • 序列预测ConvTran算法
    • 联邦学习
    • 深度学习推荐系统算法整理
    • 隐马尔可夫模型
    • 黎曼优化方法
    • FM算法
    • 机器学习常见评价指标
    • VAE算法
    • Adam优化器详解
    • Transformer算法
    • Self-attention 推荐算法
    • CNN 卷积神经网络
    • 图嵌入
    • 集成学习算法
    • RecBole开源框架
    • NCE-PLRec
    • 深度学习初始化方法
    • RNN循环神经网络
    • PyTorch数据处理
    • PyTorch安装和基本操作
    • XGBoost算法
    • NCF算法与简单MF的对比
    • 计算最佳传输
  • CSS
    • 什么是BFC
    • 纯CSS实现可拖动布局
    • 滚动穿透解决方案
  • React
    • React 生命周期
    • React Ref
    • React Hooks
    • SWR
    • React 数据流
    • React 函数式组件和类组件的区别
  • 可视化
    • OffscreenCanvas
    • Echarts 平滑曲线端点为什么不平滑
    • 颜色空间
    • 词云布局解析
    • 3D 数学基础
    • Canvas 图片处理
    • GLGL ES
    • WebGL 中绘制直线
    • Graphics API
    • 现代计算机图形学基础
    • Canvas 灰度
  • Vue
    • Vue2.x全局挂载整理
    • Vue2.6.x源码阅读
      • Vue2.6.x源码阅读 - 2.目录结构分析
      • Vue2.6.x源码阅读 - 4.源码阅读-platform
      • Vue2.6.x源码阅读 - 1.准备工作
      • Vue2.6.x源码阅读 - 5.源码阅读-core-Vue构造函数
      • Vue2.6.x源码阅读 - 7.源码阅读-core-响应式原理
      • Vue2.6.x源码阅读 - 3.源码阅读-shared
      • Vue2.6.x源码阅读 - 6.源码阅读-core-组件挂载
    • Vue + TypeScript Web应用实践
    • Vue2.x指令
    • nextTick()的使用
    • vue-cli2.x 的使用与项目结构分析
    • Vue响应式原理及总结
    • VueX的使用
    • Electron-Vue + Python 桌面应用实践
    • Vite
    • Vue组件通信整理
    • 记录一个问题的探索过程
  • Linux
    • memcg
  • GameDev
    • 游戏中的几种投影视图
    • 从零开始写软渲染器06
    • 从零开始写软渲染器05
    • 从零开始写软渲染器04
    • 从零开始写软渲染器03
    • 从零开始写软渲染器02
    • 从零开始写软渲染器01
    • 从零开始写软渲染器00
    • 现代游戏常用的几种寻路方案(一)
  • Node
    • NPM Dependency
    • Node 优势
    • Node Stream
    • Node 模块系统
  • HTML
    • html5语义与结构元素
  • 跨端
    • Flutter 介绍
  • Golang
    • Golang 基础
  • AR
    • SceneKit
由 GitBook 提供支持
在本页
  • API 介绍
  • 创建 OffscreenCanvas
  • ImageBitmap
  • 同步显示 OffscreenCanvas
  • 异步显示 OffscreenCanvas
  • 在 Worker 中使用

这有帮助吗?

  1. 可视化

OffscreenCanvas

Canvas 计算和渲染和用户操作响应都发生在同一个线程中,在动画中(有时候很耗时)的计算操作将会导致 App 卡顿,降低用户体验。Canvas 的绘制功能都与标签绑定在一起,这意味着 Canvas API 和 DOM 是耦合的。而 OffscreenCanvas,正如它的名字一样,通过将 Canvas 移出屏幕来解耦了 DOM 和 Canvas API。 由于这种解耦,OffscreenCanvas 的渲染与 DOM 完全分离了开来,并且比普通 Canvas 速度提升了一些,而这只是因为两者(Canvas 和 DOM)之间没有同步。但更重要的是,将两者分离后,Canvas 将可以在 Web Worker 中使用,即使在 Web Worker 中没有 DOM。这给 Canvas 提供了更多的可能性。

API 介绍

创建 OffscreenCanvas

OffscreenCanvas()

创建一个 OffscreenCanvas 有两种方式,一种是直接使用 OffscreenCanvas 的构造函数:

const offscreen = new OffscreenCanvas(width, height);
HTMLCanvasElement.transferControlToOffscreen();

另外一种方式,是使用 canvas 的 transferControlToOffscreen 函数获取一个 OffscreenCanvas 对象,绘制该 OffscreenCanvas 对象,同时会绘制 canvas 对象。 canvas 对象调用了函数 transferControlToOffscreen 移交控制权之后,不能再获取绘制上下文,调用 canvas.getContext('2d')会报错; 同样的原理,如果 canvas 已经获取的绘制上下文,调用 transferControlToOffscreen 会报错。

const canvas = document.getElementById("canvas");
const offscreen = canvas.transferControlToOffscreen();

ImageBitmap

ImageBitmap 接口表示能够被绘制到 上的位图 p 图像,具有低延迟的特性。运用 createImageBitmap() 工厂方法模式,它可以从多种源中生成。 ImageBitmap 提供了一种异步且高资源利用率的方式来为 WebGL 的渲染准备基础结构。

ImageBitmapRenderingContext

ImageBitmapRenderingContext 是 canvas 的绘制上下文,能够提供使用 ImageBitmap 替换 canvas 的能力,可以在 window 或者 worker 中使用。

ImageBitmapRenderingContext.transferToImageBitmap()

通过 transferToImageBitmap 函数可以从 OffscreenCanvas 对象的绘制内容创建一个 ImageBitmap 对象。该对象可以用于到其他 canvas 的绘制。

ImageBitmapRenderingContext.transferFromImageBitmap()

通过 transferFromImageBitmap 函数可以在上下文对应的 canvas 中绘制 ImageBitmap 对象。该 ImageBitmap 对象的所有权同时转移到画布上。

同步显示 OffscreenCanvas

同步显示的思路就是渲染的代码使用 offscreen,渲染完成后,通过 ImageBitmap 的能力将绘制结果同步到展示的 canvas 中

const canvasBitMapCtx = document
  .getElementById("canvas")
  .getContext("bitmaprenderer");
const offscreen = new OffscreenCanvas(width, height);
const ctx = offscreen.getContext("2d");
// do some drawing with ctx...
const bitmap = offscreen.transferToImageBitmap();
canvasBitMapCtx.transferFromImageBitmap(bitmap);

异步显示 OffscreenCanvas

异步显示的思路是将展示的 canvas 的控制权移交给 OffscreenCanvas,然后直接操作 OffscreenCanvas 的渲染上下文进行绘制,绘制结果会直接显示在展示的 canvas 中

const canvas = document.getElementById("canvas");
const offscreen = canvas.transferControlToOffscreen();
// 使用 offscreen 中的上下文直接绘制
const ctx = offscreen.getContext("2d");
// do some drawing with ctx...

在 Worker 中使用

Worker 中使用 OffscreenCanvas 也是上文的两种思路,同步或者异步。在 Worker 中渲染的好处是不会占用主线程,能够在计算和绘制的过程中不阻塞页面的交互,也能够提升一定的性能。 同步 同步使用 OffscreenCanvas 是将展示的 canvas bitmaprenderer 上下文发送到 worker 中,worker 进行绘制的过程中不断将 ImageBitmap 传回主线程,主线程中通过 ImageBitmap 进行展示 canvas 的更新。 异步 将展示的 canvas 的控制权移交给 OffscreenCanvas,然后将 OffscreenCanvas 发送给 Worker,计算和渲染的操作都交给 Worker 当中。由于移交控制权的方式能直接控制到绘图上下文,Worker 中不再需要向主线程中回传,直接使用上下文绘制即可。

上一页可视化下一页Echarts 平滑曲线端点为什么不平滑

最后更新于4年前

这有帮助吗?