• 首页
  • 技术
  • 旅行
  • 车模
  • 关于

JZ's Blog

{技术, 绘画, 旅行, 摄影, 多肉}
  • 首页
  • 技术
  • 旅行
  • 车模
  • 关于
首页  /  技术  /  高性能 WebGL —— 使用 ImageBitmap 提升纹理性能
24 三月 2019

高性能 WebGL —— 使用 ImageBitmap 提升纹理性能

作者:jz1108
技术 WebGL, 前端, 性能 写评论

什么是 ImageBitmap?

我们先来看规范上是怎么说的:

An ImageBitmap object represents a bitmap image that can be painted to a canvas without undue latency.

直接翻译过来就是:ImageBitmap 表示一个位图图像,可以绘制到 canvas 上,同时不会有较大的延迟。通过描述可以看出这个对象可以用来在 canvas 中绘制图像,同时性能也比常规的方法好。至于性能为什么好,好在哪里我会在后面讲述,下面我们先来了解一下这个对象以及如何创建并使用这个对象。

ImageBitmap 对象包含的属性和方法很少,只有 width、height 两个属性,以及 close 方法。width 和 height 用来描述图像的宽度和高度,就像普通的 Image 对象一样。而 close 方法用来释放资源,降低内存消耗。

如何创建一个 ImageBitmap ?

通过全局的 createImageBitmap 方法可以创建一个 ImageBitmap 实例。该方法的原型有两个:

createImageBitmap(image[, options]):Promise
createImageBitmap(image, sx, sy, sw, sh[, options]):Promise

方法的参数如下:

  • image:HTMLImageElement | SVGImageElement | HTMLVideoElement | HTMLCanvasElement | Blob | ImageData | ImageBitmap | OffscreenCanvas:原始的图像对象,可以看到常见的元素都能支持。
  • sx:number:原始图像截取的x坐标。
  • sy:number:原始图像截取的y坐标。
  • sw:number:截取宽度。
  • sh:number:截取高度。
  • options:可选的配置参数,参数如下:
    • imageOrientation:设置图像是否在 y 方向上取反。允许的值为 none (默认)或者 flipY。
    • premultiplyAlpha:设置图像是否提前将透明信息添加到其余颜色通道中。允许的值为 none、premultiply 或者 default(默认)。
    • colorSpaceConversion:设置是否转换颜色空间。允许的值为 none 或者 default (默认)。default 表示可能会做默认的转换。
    • resizeWidth:设置输出的宽度。
    • resizeHeight:设置输出的高度。
    • resizeQuality:设置调整尺寸的质量。允许的值为 pixelated、low (默认)、 medium 或者 high。

方法返回一个 Promise 对象,需要通过 then 方法获得结果并处理后续操作。从这里也能看出创建过程是异步的。

一个简单的例子

fetch(url).then(response => {
    response.blob().then(blob => {
        createImageBitmap(blob).then(img => {
            // img 即是一个 ImageBitmap 实例
        });
    });
});

通过 fetch 方法发起一个图片请求,接着利用 blob 方法得到一个 blob 对象,进而创建出一个 ImageBitmap 实例。

性能好在哪里?

不论是在 canvas 里绘制2d图像,还是在 WebGL 中创建纹理,当使用图像时浏览器会把图像做一次解码(decode)处理。这个解码也就是把图像的原始格式(比如 jpeg、png 等)统一转换为位图,即每个像素使用 RGB 或 RGBA 来描述。当图片尺寸比较大的时候,解码也会有一定的消耗,而且这个耗时是同步的。

在下面试验中页面加载了一个 2048 x 2048 大小的图片并创建纹理:

通过 Chrome 的 DevTools 发现调用 texImage2D 时会有20多毫秒的解码过程。使用 ImageBitmap 即可将这个同步解码的耗时去掉:

现在调用 texImage2D 不会再产生解码的耗时,但是纹理传输仍然需要时间。

在 Worker 中使用

ImageBitmap 可以在 Worker 中创建,这样我们可以将实例直接传给“主线程”。进一步减少了“主线程”处理的时间。

使用 Closure Compiler 编译遇到的问题。

最近在项目里使用 ImageBitmap 了,但用 Closure Compiler 编译的时候遇到报错,提示 createImageBitmap 方法未定义,更新版本即可解决该问题。更新后还存在警告,原来是编译器按照6个参数的函数原型做校验,而项目当中使用的是2个参数的方式。还有一点需要注意,options 中的属性需要用引号阔起来,否则会被编译器混淆。

 Previous Article 跨越1600公里的旅行——车专辑
Next Article   WebGL 文章汇总

相关文章

  • iOS 13 Safari 的一些变化

    2019年11月13日
  • WebGL 文章汇总

    2019年9月12日
  • WebGL 绘制技巧之:如何绘制有洞的多边形。

    2018年10月31日

留言

取消回复

近期文章

  • 记录一次解决 no buffer is bound to enabled attribute 报错的过程
  • TypeScript 中的装饰器
  • iOS 13 Safari 的一些变化
  • WebGL 文章汇总
  • 高性能 WebGL —— 使用 ImageBitmap 提升纹理性能

近期评论

  • jz1108发表在《记录一次解决 no buffer is bound to enabled attribute 报错的过程》
  • xiangnan发表在《记录一次解决 no buffer is bound to enabled attribute 报错的过程》
  • lew发表在《WebGL绘制详解之五:Stencil Buffer》
  • jz1108发表在《WebGL基础绘制之一:绘制一个点》
  • jz1108发表在《WebGL 文章汇总》

文章归档

  • 2021年三月
  • 2019年十一月
  • 2019年九月
  • 2019年三月
  • 2018年十二月
  • 2018年十一月
  • 2018年十月
  • 2017年十一月
  • 2017年十月
  • 2017年九月
  • 2017年五月
  • 2017年四月
  • 2017年三月
  • 2017年二月
  • 2017年一月
  • 2016年十一月
  • 2016年十月
  • 2016年四月
  • 2016年三月
  • 2016年二月
  • 2016年一月
  • 2015年十二月
  • 2015年十一月
  • 2015年十月
  • 2015年九月
  • 2015年八月
  • 2015年七月
  • 2015年六月
  • 2015年三月
  • 2014年十二月
  • 2014年十一月
  • 2014年十月
  • 2014年八月
  • 2014年七月
  • 2014年六月
  • 2014年五月
  • 2014年四月
  • 2014年三月
  • 2014年二月
  • 2014年一月
  • 2013年十二月
  • 2013年十一月
  • 2013年十月
  • 2013年九月
  • 2013年八月
  • 2013年七月
  • 2013年六月
  • 2013年五月
  • 2013年四月
  • 2013年三月
  • 2013年二月
  • 2013年一月
  • 2012年十二月
  • 2012年十月
  • 2012年九月
  • 2012年七月
  • 2012年六月
  • 2012年五月
  • 2012年一月
  • 2011年十一月
  • 2011年十月
  • 2011年九月
  • 2011年八月
  • 2011年七月
  • 2011年六月
  • 2011年五月
  • 2011年四月
  • 2011年二月
  • 2011年一月
  • 2010年十二月
  • 2010年十月
  • 2010年九月
  • 2010年六月
  • 2010年五月
  • 2010年四月
  • 2010年三月
  • 2010年二月
  • 2010年一月
  • 2009年十二月
  • 2009年十一月
  • 2009年九月
  • 2009年八月
  • 2009年六月
  • 2009年三月
  • 2009年二月
  • 2009年一月

分类目录

  • 地图API
  • 多肉
  • 开发
  • 技术
  • 摄影
  • 旅行
  • 未分类
  • 汽车
  • 绘画
  • 美食
  • 车模
  • 随笔

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org
© Copyright 2015. Theme by BloomPixel.