`

HTML5 canvas性能之画圈

阅读更多

主要讲了HTML5 canvas性能方面的尝试,场景是在canvas上面绘制圆圈。


圣诞

我一直在尝试使用HTML5 canvas在圣诞树图片上面绘制泡泡。由于不知道哪种绘制的方法最好,最终在Stack Overflow上找到了使用radial gradients(辐射渐变)绘制圆圈的答案。

圆圈

你可能已经知道,标准地画圆圈的方法是使用arc()分享一个最好用的UI前端框架!

.代码 
  1. // Drawing a circle the traditional way  
  2. ctx.beginPath();  
  3. ctx.arc(x, y, radius, 0, Math.PI * 2, true);  
  4. ctx.fillStyle = 'rgba(195, 56, 56, 1)';  
  5. ctx.fill();  
  6. ctx.closePath();  

 

以我之见,与SVG的例子相比这种绘制圆圈的方法有点笨重。我认为仅仅使用radial gradients是一种更明智的选择,只是不知道它的性能如何。

.代码 
  1. // Drawing a circle with a radial gradient  
  2. var gradient = ctx.createRadialGradient(x, y, 0, x, y, radius);  
  3. gradient.addColorStop(0.95'rgba(195, 56, 56, 1)');  
  4. gradient.addColorStop(1'rgba(195, 56, 56, 0)');  
  5. ctx.fillStyle = gradient;  
  6. ctx.fillRect(x - radius, y - radius, x + radius, y + radius);  

 

毫无疑问地,使用radial gradients会比arc()更慢。慢了好几倍!你可以在测试页面尝试下,就可以了解到速度的差距。

如果我正确地思考,我应该意识到这点而不需要去测试它,这样可以节省些时间。但是我接下来尝试使用了球体(当然不是3D地球体,是有色差渐变地圆圈)。分享一个最好用的UI前端框架!

球体

在canvas中有两种通用地方法来绘制球体:

Radial grandients

.代码 
  1. // Drawing a sphere with radial gradients  
  2. var gradient = ctx.createRadialGradient(x, y, 0, x, y, radius);  
  3. gradient.addColorStop(0'rgba(255, 255, 255, 1)');  
  4. gradient.addColorStop(0.2'rgba(255, 85, 85, 1)');  
  5. gradient.addColorStop(0.95'rgba(128, 0, 0, 1)');  
  6. gradient.addColorStop(1'rgba(128, 0, 0, 0)');  
  7. ctx.fillStyle = gradient;  
  8. ctx.fillRect(x - radius, y - radius, x + radius, y + radius);  

 

使用drawImage()绘制边缘颜色与背景色相同(或透明、可以和背景融合)的图片

.代码 
  1. // Drawing a sphere with an existing image  
  2. var img = new Image();  
  3. img.src = 'images/baubles.png';  
  4. ctx.drawImage(img, x, y, width, height);  

 

和之前地例子一样,radial gradients要慢好几倍。当然优势就是radial gradients是可以即时地动态改变,而画图片地方法则需要预先制作好图片。那些图片没办法通过javascript来直接修改,虽然你可以很容易地修改它们显示大小。你也可以通过以下几种方法来控制颜色:

  1. 使用包含指定颜色图片地图片sprite

  2. 使用灰度图片,并且使用arc()来设置半透明浮层

别忘了,使用图片意味着它们需要被下载,所以记得如果可能预加载图片。

你可以在测试页面上测试下性能。分享一个最好用的UI前端框架!

你可以看到,很明显浮层方法较慢,但是和gradients相比还是快地。在控制颜色方面,它也给了你更多自由,不过所有地方法都要比单纯绘制原始图片要慢。

总结

通常情况下,对于简单地地程序或者是快速地硬件来说,这些速度地差别是很难注意到地。但是如果你在使用动画、制作高性能游戏或是为TV/机顶盒之类地硬件设计程序,那么它们就会成为一个问题了。一如既往,所有的决定都是一种妥协,所以这里列出了各种权衡情况的总结:

  • 如果你想要绘制圆圈,使用arc()

  • 如果你想要绘制球体,使用一张图片(预加载它)

  • 如果你绘制各种各样的图片,使用图片sprites

  • 如果你想要球体可以动态改变颜色,考虑使用一张图片和半透明浮层

  • 只有在万不得已的情况下才使用radial gradients

更新:

Marcelo提出了一种很酷的方法:在一个隐藏的canvas上面创建一个简单的图片,然后使用drawImage()重复绘制它。这种方法避免了创建图片的步骤,并且也可以即时修改颜色。最棒的是,不考虑初始化gradient的时间,它比绘制一张已有的图片还要快!代码如下: 分享一个最好用的UI前端框架!

.代码 
  1. // Create a second "buffer" canvas but don't append it to the document  
  2. var tmpCanvas = document.createElement('canvas');  
  3. var tmpCtx = tmpCanvas.getContext('2d');  
  4. // Add the necessary gradients here, as above  
  5. // Draw the image from the second "buffer" canvas  
  6. ctx.drawImage(tmpCanvas, x, y, width, height);  
0
0
分享到:
评论

相关推荐

    HTML5 Canvas射线能量光圈动画.zip

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式用户体验。"HTML5 Canvas射线能量光圈动画"是一个利用Canvas API实现的特效,常见于游戏、视觉艺术或者网站加载...

    HTML5 Canvas射线能量光圈动画

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的视觉效果。在这个“HTML5 Canvas射线能量光圈动画”项目中,我们利用Canvas的2D渲染上下文(2D Rendering Context)来...

    html5canvas 写的指针式钟表

    HTML5 Canvas是一个强大的Web绘图工具,允许开发者在网页上直接绘制图形,为网页增加动态和交互性。在这个“html5canvas 写的指针式钟表”项目中,我们看到的是一个利用HTML5 Canvas、JavaScript以及可能的一些CSS...

    HTML5 Canvas实现背景光圈弥漫的烛火飘摇动画效果源码.zip

    HTML5 Canvas是一个强大的Web图形绘制工具,它允许开发者在网页上直接通过JavaScript代码进行像素级别的图形操作。这个压缩包文件“HTML5 Canvas实现背景光圈弥漫的烛火飘摇动画效果源码.zip”包含了一个使用Canvas ...

    HTML5 Canvas彩色圆点烟花特效.zip

    HTML5 Canvas是一个强大的图形绘制工具,它允许开发者在网页上直接用JavaScript绘制图像。这个"HTML5 Canvas彩色圆点烟花特效.zip"文件包含了一个利用Canvas实现的动态效果,即当用户点击网页上的小圆点时,这些圆点...

    html5 canvas仿微信朋友圈讨红包看照片效果

    在这个项目中,“html5 canvas仿微信朋友圈讨红包看照片效果”是利用Canvas API模仿了微信朋友圈中一种特殊的红包玩法,即用户需要发送红包才能查看朋友分享的照片。这种效果增加了互动性和趣味性,提高了用户的参与...

    HTML5 Canvas制作逼真的雷达扫描动画代码

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式用户体验。"HTML5 Canvas制作逼真的雷达扫描动画代码"是一个利用Canvas API实现的项目,它能够生成一种模拟雷达...

    html5 canvas酷炫水晶光圈旋转动画特效

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式2D图形和动画。"html5 canvas酷炫水晶光圈旋转动画特效"是一个利用Canvas API实现的视觉效果,它展示了如何通过...

    HTML5 Canvas射线能量光圈动画特效代码

    总的来说,"HTML5 Canvas射线能量光圈动画特效代码"是一个展示Canvas API强大功能的例子,它涉及到动态图形绘制、颜色处理、动画原理以及可能的性能优化等多方面知识。通过学习和理解这个特效,开发者可以提升在Web...

    HTML5 Canvas实现逼真的弹簧圈文本动画特效源码.zip

    这个“HTML5 Canvas实现逼真的弹簧圈文本动画特效源码.zip”文件包含了一个利用Canvas API来实现的独特动画特效,即文本在弹簧圈上弹跳的效果。这个效果在网页设计和互动媒体中非常吸引人,可以增加用户的视觉体验。...

    HTML5 canvas实现圆圈光标粒子响应鼠标移动动画特效源码.zip

    HTML5的canvas元素是网页开发中的一个强大工具,它提供了在网页上绘制图形的能力,而无需依赖外部插件。这个“HTML5 canvas实现圆圈光标粒子响应鼠标移动动画特效源码”是一个利用canvas实现的独特视觉效果,它可以...

    html5 canvas实现的跟随鼠标移动圆圈气泡动画特效源码.zip

    HTML5 Canvas 是一种在网页上绘制图形的API,它允许开发者直接通过JavaScript代码来描绘出丰富的二维图形。这个"html5 canvas实现的跟随鼠标移动圆圈气泡动画特效源码.zip"文件,显然包含了利用Canvas API创建的一个...

    H5 Canvas粒子组成圆圈特效.zip

    【标题】"H5 Canvas粒子组成圆圈特效.zip"是一个包含HTML5 Canvas技术实现的粒子效果,用于创建动态、美观的圆形视觉效果。这个特效在网页设计中常常被用来增加互动性和吸引力,尤其是在网站背景或者特定UI元素上,...

    H5 Canvas彩色圆圈旋转动画特效.zip

    在本资源"**H5 Canvas彩色圆圈旋转动画特效.zip**"中,包含了一个使用HTML5 Canvas技术实现的彩色圆圈旋转动画效果。这个特效结合了JavaScript(可能使用了jQuery库)和CSS来创建动态、视觉吸引人的网页元素。下面...

    [HTML5资料]Canvas教程

    这个教程中还可能涵盖了事件监听、交互性设计,以及优化Canvas性能的技巧。例如,使用`toDataURL()`方法可以将画布内容转换为数据URL,便于保存或分享。而使用`getImageData()`和`putImageData()`可以对像素级别进行...

    小程序canvasDemo

    微信小程序提供了`wx.canvasToTempFilePath`方法,可以将canvas的内容转换为临时文件路径,然后保存到本地或者分享到朋友圈。这在生成个性化海报、制作DIY图片等功能中非常有用。 8. **canvas与微信接口的结合**:...

    基于Canvas绘制的密集圆圈泡泡动画特效.zip

    HTML5是现代网页开发的核心技术之一,其引入了许多新的元素、API和功能,极大地提升了Web应用的交互性和表现力。在本案例中,“基于Canvas绘制的密集圆圈泡泡动画特效.zip”是一个使用HTML5 Canvas API创建的动态...

    html5 canvas实现的仿百度网盘扫描文件加载动画特效源码.zip

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式用户体验。本资源“html5 canvas实现的仿百度网盘扫描文件加载动画特效源码.zip”提供了使用Canvas技术制作的...

    基于HTML5 Canvas实现的图表插件Chart.js实例.zip

    9. **性能优化**:尽管Canvas性能良好,但大数据集可能会导致性能下降。Chart.js提供了如缓存和局部重绘等优化策略,以提高大图渲染的效率。 10. **与框架集成**:Chart.js可以轻松集成到各种前端框架中,如React、...

Global site tag (gtag.js) - Google Analytics