HTML5 Canvas的性能提高技巧经验分享


Posted in HTML / CSS onJuly 02, 2013

使用缓存技术实现预绘制,减少重复绘制Canvs内容
很多时候我们在Canvas上绘制与更新,总是会保留一些不变的内容,对于这些内容
应该预先绘制缓存,而不是每次刷新。
直接绘制代码如下:

复制代码
代码如下:

context.font="24px Arial";
context.fillStyle="blue";
context.fillText("Please press <Esc> to exit game",5,50);
requestAnimationFrame(render);

使用缓存预绘制技术:
复制代码
代码如下:

function render(context) {
context.drawImage(mText_canvas, 0, 0);
requestAnimationFrame(render);
}
function drawText(context) {
mText_canvas = document.createElement("canvas");
mText_canvas.width = 450;
mText_canvas.height = 54;
var m_context = mText_canvas.getContext("2d");
m_context.font="24px Arial";
m_context.fillStyle="blue";
m_context.fillText("Please press <Esc> to exit game",5,50);
}

使用Canvas缓存绘制技术的时候,一定记得缓存Canvas对象大小要小于实际的Canvas 大小。尽量把绘制直线点的操作放在一起,而且尽量一次绘制完成,一个不好的代码如下:
复制代码
代码如下:

for (var i = 0; i < points.length - 1; i++) {
var p1 = points[i];
var p2 = points[i+1];
context.beginPath();
context.moveTo(p1.x, p1.y);
context.lineTo(p2.x, p2.y);
context.stroke();
}

修改以后性能较高的代码如下:
复制代码
代码如下:

context.beginPath();
for (var i = 0; i < points.length - 1; i++) {
var p1 = points[i];
var p2 = points[i+1];
context.moveTo(p1.x, p1.y);
context.lineTo(p2.x, p2.y);
}
context.stroke();

避免不必要的Canvas绘制状态频繁切换,一个频繁切换绘制style的例子如下:
复制代码
代码如下:

var GAP = 10;
for(var i=0; i<10; i++) {
context.fillStyle = (i % 2 ? "blue" : "red");
context.fillRect(0, i * GAP, 400, GAP);
}

避免频繁切换绘制状态,性能更好的绘制代码如下:
复制代码
代码如下:

// even
context.fillStyle = "red";
for (var i = 0; i < 5; i++) {
context.fillRect(0, (i*2) * GAP, 400, GAP);
}
// odd
context.fillStyle = "blue";
for (var i = 0; i < 5; i++) {
context.fillRect(0, (i*2+1) * GAP, 400, GAP);
}

绘制时,只绘制需要更新的区域,任何时候都要避免不必要的重复绘制与额外开销。对于复杂的场景绘制使用分层绘制技术,分为前景与背景分别绘制。定义Canvas层的
HTML如下:
复制代码
代码如下:

<canvas id="bg" width="640" height="480" style="position: absolute; z-index: 0">
</canvas>
<canvas id="fg" width="640" height="480" style="position: absolute; z-index: 1">
<SPAN style="FONT-SIZE: 18px"></canvas>
</SPAN>

如果没有必要,要尽量避免使用绘制特效,如阴影,模糊等。

避免使用浮点数坐标
绘制图形时,长度与坐标应选取整数而不是浮点数,原因在于Canvas支持半个像素绘制会根据小数位实现插值算法实现绘制图像的反锯齿效果,如果没有必要请不要选择浮点数值。

清空Canvas上的绘制内容
context.clearRect(0, 0, canvas.width,canvas.height)
但是其实在Canvas还有一种类似hack的清空方法:
canvas.width = canvas.width;
也可以实现清空canvas上内容的效果,但是在某些浏览器上可能不支持。

HTML / CSS 相关文章推荐
a标签的css样式四个状态
Mar 09 HTML / CSS
HTML5和CSS3让网页设计提升到下一个高度
Aug 14 HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
Oct 23 HTML / CSS
HTML5 Canvas 起步(2) - 路径
May 12 HTML / CSS
使用CSS实现弹性视频html5案例实践
Dec 26 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
Jul 19 HTML / CSS
HTML5 script元素async、defer异步加载使用介绍
Aug 23 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
Apr 08 HTML / CSS
HTML5的hidden属性兼容老浏览器的方法
Apr 23 HTML / CSS
canvas绘图按照contain或者cover方式适配并居中显示
Feb 18 HTML / CSS
HTML5实现视频弹幕功能
Aug 09 HTML / CSS
HTML5中外部浏览器唤起微信分享功能的代码
Sep 15 HTML / CSS
html5 CSS过度-webkit-transition使用介绍
Jul 02 #HTML / CSS
仿CSDN Blog返回页面顶部功能实现原理及代码
Jun 30 #HTML / CSS
Html5实现iPhone开机界面示例代码
Jun 30 #HTML / CSS
html5 input属性使用示例
Jun 28 #HTML / CSS
HTML中使用SVG与SVG预定义形状元素介绍
Jun 28 #HTML / CSS
html5贪吃蛇游戏使用63行代码完美实现
Jun 25 #HTML / CSS
html5如何及时更新缓存文件(js、css或图片)
Jun 24 #HTML / CSS
You might like
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
利用PHP判断文件是否为图片的方法总结
2017/01/06 PHP
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
JavaScript 数组详解
2013/10/10 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
python关键字and和or用法实例
2015/05/28 Python
简析Python的闭包和装饰器
2016/02/26 Python
Python算术运算符实例详解
2017/05/31 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
python内打印变量之%和f的实例
2020/02/19 Python
Python headers请求头如何实现快速添加
2020/11/03 Python
互动出版网:专业书籍
2017/03/21 全球购物
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
学生实习推荐信范文
2013/11/26 职场文书
个人委托书范本汇总
2014/10/01 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
电子商务实训报告总结
2014/11/05 职场文书
让子弹飞观后感
2015/06/11 职场文书
信息技术国培研修日志
2015/11/13 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸