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);
时间: 2024-10-02 08:30:35

HTML5 canvas性能之画圈的相关文章

用HTML5 Canvas做一个画图板

使用HTML5可以非常简单地在canvas上实现画图应用,用支持html5的浏览器便可在下面的区域进行绘画,要看到演示效果,请确保你的浏览器支持HTML5: 功能很简单,原理其实和拖放是类似的,主要是三个事件: 在canvas 上绑定mousedown 事件以标志绘画的开始(调用moveTo 移动画笔)澳门娱乐场 在document 上绑定mousemove 事件来处理绘画时的行为(调用lineTo 以及stroke 进行绘画) 在document 上绑定mouseup 事件以标志绘画的结束(解

提高HTML5 Canvas性能的技巧

详细内容请点击 一:使用缓存技术实现预绘制,减少重复绘制Canvs内容 很多时候我们在Canvas上绘制与更新,总是会保留一些不变的内容,对于这些内容 应该预先绘制缓存,而不是每次刷新. 直接绘制代码如下: context.font="24px Arial";context.fillStyle="blue";context.fillText("Please press to exit game",5,50);requestAnimationFra

Html5新特性 <canvas>画板画直线

 以下样例为用canvas标签画多条直线 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht

HTML5 Canvas 画钟表

画钟表是2D画图的老生常谈,我也不能免俗弄了一个.代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <head> <title>钟表</title> </head> <body onloa

html5 canvas画饼

1. [图片] lxdpie.jpg ?2. [文件] lqdpie.html ~ 801B     下载(7) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html lang="ru"><head>  <title></title>  <met

[转]html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法

继续讲canvas中画曲线的方法,今天讲quadraticCurveTo. 说实话这个方法有点吓人,单从函数名称上都可以初体验.话说,我觉得有必要把这个函数名缩短. quadratic的意思是二次,即数学中二次元方程那个二次.而ctx.quadraticCurveTo的参数如下: 代码如下: ctx.quadraticCurveTo(x1,y1,x,y); 其中x,y是终点的坐标,而x1,y1是曲线控制点的坐标?什么?你问我起点在哪里?起点在此之前用moveTo确定. 我之所以把控制点的坐标带上

html5 canvas+js实现ps钢笔抠图

html5 canvas+js实现ps钢笔抠图 1. 项目要求需要用js实现photoshop中钢笔抠图功能,就用了近三四天的时间去解决它,最终还是基本上把他实现了. 做的过程中走了不少弯路,最终一同事找到了canvans以比较核心的属性globalCompositeOperation = "destination-out", 属性可以实现通过由多个点构成的闭合区间设置成透明色穿透画布背景色或是背景图片,这样省了许多事. 2.实现效果: 鼠标点完之后会将所有的点连成闭合区间,并可自由拖

Html5 Canvas斗地主游戏

过完年来公司,没什么事,主管说研究下html5 游戏,然后主管就给了一个斗地主的demo,随后我就开始看代码, 现在我看了html5以及canvas相关知识和斗地主的demo后,自己用demo上的素材试着写了个斗地主,代码没重构好,欢迎赐教. 演示地址:CanVas斗地主 话不多说,下面就一步一步解释下吧 只有一个common.js文件 1.资源类 1 var Resource = Class.create(); 2 $.extend(Resource.prototype, { 3 initia

HTML5 程序设计 - 使用HTML5 Canvas API

请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方便查看. 学习笔记,纯手工码字,有错别字什么的请指出,觉得好的请点个赞小小的支持下.谢谢亲们. 本篇,我们将探索如何使用HTML5和Canvas API.Canvas API很酷,可以通过它来动态生成和展示图形.图表.图像以及动画. 本篇将使用渲染API(Rendering API)的基本功能来创建