canvas性能-drawImage渲染图片
canvas性能-绘制图片
canvas绘制图片
一般我们绘制图片会用到的方法是drawImage和putImageData,还有作为测试环境使用的createPattern
drawImage
描述:
使用方式:
ctx.drawImage(image,sx,sy,swidth,sheight,x,y,width,height)
- image的类型:
- HTMLImageElement:这些图片是由Image()函数构造出来的,或者任何的img元素
- HTMLVideoElement:用一个HTML的video元素作为你的图片源,可以从视频中抓取当前帧作为一个图像
- HTMLCanvasElement:可以使用另一个canvas元素作为你的图片源
- ImageBitmap:这是一个高性能的位图,可以低延迟地绘制,它可以从上述的所有源以及其它几种源中生成
- sx:可选。开始剪切的 x 坐标位置
- sy:可选。开始剪切的 y 坐标位置
- swidth:可选。被剪切图像的宽度
- sheight:可选。被剪切图像的高度
- x:在画布上放置图像的 x 坐标位置
- y:在画布上放置图像的 y 坐标位置
- width:可选。要使用的图像的宽度。(伸展或缩小图像)
- height:可选。要使用的图像的高度。(伸展或缩小图像)
putImageData
描述: Canvas 2D API 将数据从已有的 ImageData 对象绘制到位图的方法。 如果提供了一个绘制过的矩形,则只绘制该矩形的像素。此方法不受画布转换矩阵的影响。
使用方式:
ctx.putImageData(imageData, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight)
- ImageData:包含像素值的数组对象
- dx:源图像数据在目标画布中的位置偏移量(x 轴方向的偏移量)
- dy:源图像数据在目标画布中的位置偏移量(y 轴方向的偏移量)
- dirtyX:可选 在源图像数据中,矩形区域左上角的位置。默认是整个图像数据的左上角(x 坐标)
- dirtyY:可选 在源图像数据中,矩形区域左上角的位置。默认是整个图像数据的左上角(y 坐标)
- dirtyWidth:可选 在源图像数据中,矩形区域的宽度。默认是图像数据的宽度
- dirtyHeight:可选 在源图像数据中,矩形区域的高度。默认是图像数据的高度。
createPattern
描述:指定的方向内重复指定的元素,元素可以是图片、视频,或者其他 canvas 元素,被重复的元素可用于绘制/填充矩形、圆形或线条等等。
使用方式:
ctx.fillStyle = ctx.createPattern(img,"repeat")
ctx.fill();
测试绘制耗时
测试图片尺寸为(500x500)和(1920x1080)的jpg图片
drawImage
首先测试的是drawImage方法,通过绘制同一张图片不同的资源类型下的耗时
Image类型
- 在空白canvas情况下渲染该图片耗时:0.01ms左右
- 在使用了
createPattern填充了canvas作为背景的情况下渲染该图片耗时:0.01ms左右
ImageBitmap类型
- 在空白canvas情况下渲染该图片耗时:1ms左右,(1920*1080)是1.8ms左右
- 在使用了
createPattern填充了canvas作为背景的情况下渲染该图片耗时:0.01ms左右,(1920*1080)是2ms左右
HTMLCanvasElement类型
- 在空白canvas情况下渲染该图片耗时:0.01ms左右
- 在使用了
createPattern填充了canvas作为背景的情况下渲染该图片耗时:12ms左右,(1920*1080)是14ms左右
putImageData
- 在空白canvas情况下渲染该图片耗时:1ms左右
- 在使用了
createPattern填充了canvas作为背景的情况下渲染该图片耗时:2ms左右
| 渲染图片方式 | 空白canvas下渲染耗时 图片尺寸(500*500) | 使用createPattern铺满下渲染耗时 图片尺寸(500*500) | 空白canvas下渲染耗时 图片尺寸(1920*1080) | 使用createPattern铺满下渲染耗时 图片尺寸(1920*1080) |
|---|---|---|---|---|
| drawImage(Image) | 0.01ms | 0.01ms | 0.01ms | 0.01ms |
| drawImage(ImageBitmap) | 0.01ms | 0.01ms | 0.01ms | 0.01ms |
| drawImage(HTMLCanvasElement) | 0.01ms | 12ms | 0.01ms | 14ms |
| putImageData | 1ms | 2ms | 1.8ms | 3ms |
结论
- 由上面的测试结果可以看出在空白canvas下渲染图片,除了putImageData剩下的性能是一致的即Image = ImageBitmap = HTMLCanvasElement > putImageData。
- 而使用了createPattern平铺作为背景的情况下Image = ImageBitmap > putImageData > HTMLCanvasElement
- 渲染图片尺寸大小一般情况下对drawImage(Image)和drawImage(ImageBitmap)的影响较小,而且性能优越。
- createPattern铺满的情况下drawImage(HTMLCanvasElement)的性能最差和drawImage(Image)能达到3个数量级的差距
- drawImage(HTMLCanvasElement)在空白canvas下性能也很优越
- putImageData的性能处于中等,使用createPattern铺满背景的情况下会有一定影响,不过不是太大
所以可以不使用使用createPattern铺满背景的情况下尽量不要使用,可以使用多层canvas,不必要的层级可以减少重绘。或者将平铺的背景转为Image对象使用。
当然以上的结论为我个人开发时的遇到的问题的总结,如果有误请提出。因为样本数量和图片格式并没有达到太多。
canvas性能-drawImage渲染图片的更多相关文章
- canvas代替img渲染图片
移动端用canvas代替img渲染图片,可以提高性能 var oImg = new Image(); oImg.src = url; oImg.onload = function(){ var cvs ...
- Canvas中 drawImage绘制图片不显示
在学习 html5中的 Canvas.drawImage时写了如下代码: <!doctype html> <html> <head><title>研究& ...
- 软件项目技术点(8)—— canvas调用drawImage绘制图片
AxeSlide软件项目梳理 canvas绘图系列知识点整理 html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本 ...
- Canvas 中drawImage 绘制不出图片
在使用Canvas的drawImage绘制图片时,却发现绘制不出图片,原因是图片是异步加载,图片加载完再绘制. //html <img src="1.png" /> & ...
- 提高HTML5 canvas性能的几种方法
简介 HTML5 canvas 最初起源于苹果(Apple)的一项实验,现在已经成为了web中受到广泛支持的2D快速模式绘图(2Dimmediate mode graphic)的标准.许多开发者现在利 ...
- 小程序Canvas性能优化实战
以下内容转载自totoro的文章<小程序Canvas性能优化实战!> 作者:totoro 链接:https://blog.totoroxiao.com/canvas-perf-mini/ ...
- iOS给图片添加滤镜&使用openGLES动态渲染图片
给图片增加滤镜有这两种方式: CoreImage / openGLES 下面先说明如何使用CoreImage给图片添加滤镜, 主要为以下步骤: #1.导入CIImage格式的原始图片 #2.创建CIF ...
- React Canvas:高性能渲染 React 组
React Canvas 提供了使用 Canvas 渲染移动 Web App 界面的能力,替代传统的 DOM 渲染,具有更接近 Native App 的使用体验.React Canvas 提供了一组标 ...
- Android 性能优化——之图片的优化
Android 性能优化——之图片的优化 在Android性能优化中,我们会发现占内存最大的和对性能影响最大的往往是图片资源,其次是控件资源.相对来说,其他的资源的影响会小一点.这里我就先对图片资源的 ...
随机推荐
- RabbitMQException com.rabbitmq.client.ShutdownSignalException: connection error; protocol meth
异常1 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ...
- Spring Cloud 入门教程(二): 服务消费者(rest+ribbon)
在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...
- Spring Boot 2.4版本前后的分组配置变化及对多环境配置结构的影响
前几天在<Spring Boot 2.4 对多环境配置的支持更改>一文中,给大家讲解了Spring Boot 2.4版本对多环境配置的配置变化.除此之外,还有一些其他配置变化,所以今天我们 ...
- 【超详细】MakeDown(Typora)+PicGo+Gitee实现图床
[超详细]MakeDown(Typora)+PicGo+Gitee实现图床 序言:我们有时在用makedown整理笔记时想把自己的笔记上传到博客园,可是发现在上传过程中makedown中的图片显示不出 ...
- 如何用Python判断一个文件是否被占用?
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 今天有同学问,用os模块的access()能否判断一个文件是否被占用?直觉上,这是行不通的,因为ac ...
- 闭关修炼180天--手写持久层框架(mybatis简易版)
闭关修炼180天--手写持久层框架(mybatis简易版) 抛砖引玉 首先先看一段传统的JDBC编码的代码实现: //传统的JDBC实现 public static void main(String[ ...
- NET 5 收发邮件之 MailKit
大家都用过SmtpClient来处理发送邮件的操作,不过这个类以及被标记已过时,所以介绍一个微软推荐的库MailKit来处理. MailKit开源地址:https://github.com/jsted ...
- [LeetCode]Path Sum系列
1.二叉树路径求指定和,需要注意的是由于有负数,所以即使发现大于目标值也不能返回false,而且返回true的条件有两个,到叶节点且等于sum,缺一不可 public boolean hasPathS ...
- CF Grakn Forces 2020 1408E Avoid Rainbow Cycles(最小生成树)
1408E Avoid Rainbow Cycles 概述 非常有趣的题目(指解法,不难,但很难想) 非常崇拜300iq,今天想做一套div1时看见了他出的这套题Grakn Forces 2020,就 ...
- JAVA静态代理和动态代理理解
代理 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客可以直接从厂家购买产品,但 ...