做前端的同学应该都知道,Canvas是浏览器中很重要的一个绘图元素,使用它可以绘制2D图形或者3D图形,要绘制2D或3D图形时,需要获取不同的上下文,最常用的两个上下文是2d上下文webgl上下文

const canvas = document.querySelector('canvas');

const context = canvas.getContext('2d'); // 获取2d上下文

const canvas = document.querySelector('canvas');

const context = canvas.getContext('webgl'); // 获取webgl上下文

如上面代码所示,最常用的上下文是这两个,不过这里有些细节需要注意。

?? 首先,一个canvas对象只能获取一种类型的上下文,以第一次调用getContext获取的上下文为准。

const canvas = document.querySelector('canvas');

const context = canvas.getContext('webgl'); // 获取webgl上下文

const context2 = canvas.getContext('2d');

console.log(context); // WebGLRenderingContext

console.log(context2); // null

上面的代码,canvas对象已经获取过webgl上下文,再获取2d上下文,就会返回null。

?? getContext获取上下文有第二个参数,可以传配置项,webgl和2d上下文的配置项不同。

2d上下文可以配置的参数如下:

  • alpha: boolean值,表明canvas包含一个alpha通道. 如果设置为false, 浏览器将认为canvas背景总是不透明的, 这样可以加速绘制透明的内容和图片.

webgl上下文可配置的参数如下:

  • alpha: boolean值,表明canvas包含一个alpha缓冲区,默认true。

  • antialias: boolean值,表明是否开启抗锯齿,默认true。

  • depth: boolean值,表明绘制缓冲区包含一个深度至少为16位的缓冲区,默认true。

  • failIfMajorPerformanceCaveat: boolean值,表明在一个系统性能低的环境是否创建该上下文的,默认false。

  • powerPreference: 指示浏览器在运行WebGL上下文时使用相应的GPU电源配置。可能值如下:

    • "default":自动选择,默认值。

    • "high-performance": 高性能模式。

    • "low-power": 节能模式。

  • premultipliedAlpha: boolean值,表明排版引擎讲假设绘制缓冲区包含预混合alpha通道,默认true。

  • preserveDrawingBuffer: boolean值,如果这个值为true缓冲区将不会被清除,会保存下来,直到被清除或被使用者覆盖,默认false。

  • stencil: boolean值,表明绘制缓冲区包含一个深度至少为8位的模版缓冲区,默认false。

?? 最新的chrome中还支持一个属性 desynchronized,它可以创建低延时渲染上下文。

实际上,除了webgl和2d上下文外,canvas还支持另外两种上下文,分别是:

  • webgl2 上下文,这个上下文是一个WebGL2RenderingContext渲染对象,它与webgl上下文的区别是,webgl版本基于OpenGL ES2.0,而webgl2版本基于OpenGL ES 3.0。

  • bitmaprenderer 上下文,它创建一个ImageBitmapRenderingContext渲染对象,可以将ImageBitmap对象的内容传入canvas中。

webgl2比webgl多了一些OpenGL ES 3.0实现的强大功能,它们不但性能更好而且使用更简单。所以如果你的绘图在高级浏览器上运行,可以使用webgl2代替webgl渲染。

如果你只是想要处理图片内容,你可以创建bitmaprenderer上下文,它提供transferFromImageBitmap()方法,可以将ImageBitmap的内容传入。

function loadImage(src) {

  const image = new Image();

  return new Promise((resolve) => {

    image.onload = function() {

      resolve(image);

    }

    image.src = src;

  });

}

(async function() {

  const image = await loadImage(url);

  const bitmap = createImageBitmap(image, 0, 0, 32, 32);

  const canvas = document.querySelector('canvas');

  const context = canvas.getContext('bitmaprenderer');

  context.transferFromImageBitmap(bitmap);

  ...

}());

?? 因为bitmaprenderer是可以用于worker上下文中的,所以这是一种快速让位图数据在worker和主线程中通讯的方式。

以上是canvas的4个上下文,现在新的标准支持的canvas除了原有的canvas元素,还支持离屏canvas(OffscreenCanvas),使用这些上下文和BitmapImage能够高性能地完成很多复杂的渲染,后续我们的文章中有机会再一一讨论。

关于canvas的渲染上下文,你还有什么想法,欢迎在issue中讨论。

关于奇舞周刊

《奇舞周刊》是360公司专业前端团队「奇舞团」运营的前端技术社区。关注公众号后,直接发送链接到后台即可给我们投稿。

canvas需要gpu_【前端冷知识】你了解Canvas的渲染上下文吗?相关推荐

  1. 这些鲜为人知的前端冷知识,你都GET了吗?

    来源:猴哥说前端‍‍‍‍‍‍ 背景 最近公司项目不多,比较清闲,划水摸鱼混迹于各大技术博客平台,瞬间又GET了好多前端技能,一些属于技巧,一些则是闻所未闻的冷知识,一时间还消化不过来,不由的发出一声感 ...

  2. 前端里的button怎么去除点击自带边框_前端不为人知的一面--前端冷知识集锦

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

  3. canvas刷新_【前端冷知识】Canvas 滤镜的性能优化

    最近几天没有及时更新,是因为这几天在忙一个项目mesh.js,这个项目是一个基于Canvas2D和WebGL的跨平台图形系统,提供底层的高性能API,同时也将是未来新版SpriteJS的底层渲染引擎. ...

  4. 前端不为人知的一面--前端冷知识集锦

    转自:http://www.cnblogs.com/Wayou/p/things_you_dont_know_about_frontend.html 前端已经被玩儿坏了!像console.log()可 ...

  5. 前端wxml取后台js变量值_这些鲜为人知的前端冷知识,你都GET了吗?

    背景 最近公司项目不多,比较清闲,划水摸鱼混迹于各大技术博客平台,瞬间又GET了好多前端技能,一些属于技巧,一些则是闻所未闻的冷知识,一时间还消化不过来,不由的发出一声感叹! 前端可真是博大精深 于是 ...

  6. excel判断字符串包含另一个字符串_【前端冷知识】如何正确判断一个字符串是数值?...

    在网页中,我们从用户输入的内容中获取的值通常是字符串,但是有时候我们希望用户输入的内容一定要能转成数值: <input id="userInput"> userInpu ...

  7. 一个对象的属性_【前端冷知识】如何判断一个对象的某个属性是可写的?

    这是一个咋一听好像很简单,但是实际上却没那么简单,而且是很有趣的问题. 我们先来看一下什么情况下一个对象的属性是可写的. "属性可写"这个概念并没有严谨的定义,我们这里先来规定一下 ...

  8. css border 虚线间距_【前端冷知识】CSS如何实现虚线框动画

    我们知道,CSS支持将元素的border属性设为虚线,例如: <h1>君喻学堂h1> h1 {   border: dashed 1px; } 但是,CSS的虚线样式是固定的,如果我 ...

  9. bootstrap 轮播控制时间_【前端冷知识】如何封装一个图片轮播组件

    组件封装是一个前端工程师进阶的必经之路.组件封装是指Web页面上抽出来一个个包含模版(HTML).功能(Javascript)和样式(CSS)的单元.所以,今天的内容,我们将带你了解组件封装的开发思路 ...

最新文章

  1. C/C++中static关键字用法汇总
  2. windows怎么下载安装python-windows下numpy下载与安装图文教程
  3. 谷歌浏览器怎样通过检查验证图片路径问题
  4. OC特有语法:分类category,给NSString增加方法计算字符串中数字的个数
  5. 用c++做贪吃蛇_用世界公认的变态羊毛做袜子!不用插电恒温37°C,还能抑菌99%...
  6. How to Leak a Context: Handlers Inner Classes
  7. 第 17 章 垃圾回收器
  8. html验证用户名长度,JQuery表单字符串长度验证
  9. vsan网络分区不在同一组
  10. Latex表格宽度调整
  11. Android仿IOS屏幕亮度调节-自定义view系列(5)
  12. 泰坦尼克号python数据分析统计服_Kaggle入门级赛题:泰坦尼克号生还者预测——数据分析篇...
  13. easyui树mysql_Easyui 创建异步树形菜单_EasyUI 教程
  14. 第02章 HTML基本标签
  15. 蓝牙耳机哪款性价比高?双11高颜值蓝牙耳机推荐测评
  16. 美团脱颖而出的经验_使用条件格式使重要的Outlook邮件脱颖而出
  17. HTTP与Web安全总结
  18. Eclipse Git配置
  19. 情人节特辑|桌面表白小程序
  20. STM32F407中的RT-thread系统中移植LCD的程序-FSMC控制

热门文章

  1. xampp 执行php命令,处理XAMPP环境下执行ZF命令时的报错
  2. 卸载centos7自带mysql_centos7完全卸载mysql
  3. abb机器人searchl报错_ABB机器人编程指令与函数
  4. 源码编译安装Apache-附一键部署脚本
  5. 洛谷 P2762 太空飞行计划问题
  6. Zookeeper和etcd比较
  7. 使用五种方法获取文件扩展名
  8. beeframework在ios 9.1下报错
  9. MY WAY程序(十八) 团队开发
  10. 通过Web Api 和 Angular.js 构建单页面的web 程序