通常咱们绘制图片会用到的方法是drawImage
和putImageData
,还有做为测试环境使用的createPattern
javascript
描述:html
使用方式:java
ctx.drawImage(image,sx,sy,swidth,sheight,x,y,width,height)
描述: Canvas 2D API 将数据从已有的 ImageData
对象绘制到位图的方法。 若是提供了一个绘制过的矩形,则只绘制该矩形的像素。此方法不受画布转换矩阵的影响。canvas
使用方式:数组
ctx.putImageData(imageData, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight)
描述:指定的方向内重复指定的元素,元素能够是图片、视频,或者其余 canvas 元素,被重复的元素可用于绘制/填充矩形、圆形或线条等等。ide
使用方式:函数
ctx.fillStyle = ctx.createPattern(img,"repeat") ctx.fill();
测试图片尺寸为(500x500)和(1920x1080)的jpg图片性能
首先测试的是drawImage
方法,经过绘制同一张图片不一样的资源类型下的耗时测试
createPattern
填充了canvas做为背景的状况下渲染该图片耗时:0.01ms左右createPattern
填充了canvas做为背景的状况下渲染该图片耗时:0.01ms左右,(1920*1080)是2ms左右createPattern
填充了canvas做为背景的状况下渲染该图片耗时:12ms左右,(1920*1080)是14ms左右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对象使用。code
固然以上的结论为我我的开发时的遇到的问题的总结,若是有误请提出。由于样本数量和图片格式并无达到太多。