您现在的位置是:网站首页> 编程资料编程资料
浅谈利用缓存来优化HTML5 Canvas程序的性能一张图看懂移动HTML5前端性能优化
2023-10-14
461人已围观
简介 这篇文章主要介绍了浅谈利用缓存来优化HTML5 Canvas程序的性能,并且作者给出了使用缓存以及离屏Canvas后性能较原程序的提升对比,需要的朋友可以参考下
canvas玩多了后,就会自动的要开始考虑性能问题了。怎么优化canvas的动画呢?
【使用缓存】
使用缓存也就是用离屏canvas进行预渲染了,原理很简单,就是先绘制到一个离屏canvas中,然后再通过drawImage把离屏canvas画到主canvas中。可能看到这很多人就会误解,这不是写游戏里面用的很多的双缓冲机制么?
其实不然,双缓冲机制是游戏编程中为了防止画面闪烁,因此会有一个显示在用户面前的画布以及一个后台画布,进行绘制时会先将画面内容绘制到后台画布中,再将后台画布里的数据绘制到前台画布中。这就是双缓冲,但是canvas中是没有双缓冲的,因为现代浏览器基本上都是内置了双缓冲机制。所以,使用离屏canvas并不是双缓冲,而是把离屏canvas当成一个缓存区。把需要重复绘制的画面数据进行缓存起来,减少调用canvas的API的消耗。
众所周知,调用canvas的API很消耗性能,所以,当我们要绘制一些重复的画面数据时,妥善利用离屏canvas对性能方面有很大的提升,可以看下下面的DEMO
1 、 没使用缓存
可以看到上面的DEMO的性能不一样,下面分析一下原因:为了实现每个圈的样式,所以绘制圈圈时我用了循环绘制,如果没用启用缓存,当页面的圈圈数量达到一定时,动画每一帧就要大量调用canvas的API,要进行大量的计算,这样再好的浏览器也会被拖垮啦。
XML/HTML Code复制内容到剪贴板
- ctx.save();
- var j=0;
- ctx.lineWidth = borderWidth;
- for(var i=1;i<this.r;i+=borderWidth){
- ctx.beginPath();
- ctx.strokeStyle = this.color[j];
- ctx.arc(this.x , this.y , i , 0 , 2*Math.PI);
- ctx.stroke();
- j++;
- }
- ctx.restore();
所以,我的方法很简单,每个圈圈对象里面给他一个离屏canvas作缓存区。
除了创建离屏canvas作为缓存之外,下面的代码中有一点很关键,就是要设置离屏canvas的宽度和高度,canvas生成后的默认大小是300X150;对于我的代码中每个缓存起来圈圈对象半径最大也就不超过80,所以300X150的大小明显会造成很多空白区域,会造成资源浪费,所以就要设置一下离屏canvas的宽度和高度,让它跟缓存起来的元素大小一致,这样也有利于提高动画性能。上面的四个demo很明显的显示出了性能差距,如果没有设置宽高,当页面超过400个圈圈对象时就会卡的不行了,而设置了宽高1000个圈圈对象也不觉得卡。
- var ball = function(x , y , vx , vy , useCache){
- this.x = x;
- this.y = y;
- this.vx = vx;
- this.vy = vy;
- this.r = getZ(getRandom(20,40));
- this.color = [];
- this.cacheCanvas = document.createElement("canvas");
- thisthis.cacheCtx = this.cacheCanvas.getContext("2d");
- this.cacheCanvas.width = 2*this.r;
- this.cacheCanvas.height = 2*this.r;
- var num = getZ(this.r/borderWidth);
- for(var j=0;j<num;j++){
- this.color.push("rgba("+getZ(getRandom(0,255))+","+getZ(getRandom(0,255))+","+getZ(getRandom(0,255))+",1)");
- }
- this.useCache = useCache;
- if(useCache){
- this.cache();
- }
- }
当我实例化圈圈对象时,直接调用缓存方法,把复杂的圈圈直接画到圈圈对象的离屏canvas中保存起来。
- cache:function(){
- this.cacheCtx.save();
- var j=
提示: 本文由神整理自网络,如有侵权请联系本站删除!
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!
相关内容
- 用HTML5制作数字时钟的教程Html5 canvas实现粒子时钟的示例代码HTML写一个网页动态时钟HTML5实现可缩放时钟代码用HTML5的canvas实现一个炫酷时钟效果使用html5 canvas 画时钟代码实例分享html5绘制时钟动画html5时钟实现代码HTML 罗盘式时钟的实现
- 用HTML5 实现橡皮擦的涂抹效果的教程Html5+JS实现手机摇一摇功能HTML5 Canvas的事件处理介绍HTML5 audio标签使用js进行播放控制实例
- 用HTML5中的Canvas结合公式绘制粒子运动的教程详解使用HTML5 Canvas创建动态粒子网格动画Html5 canvas实现粒子时钟的示例代码
- 使用分层画布来优化HTML5渲染的教程html5 分层屏幕适配的方法Html分层的box-shadow效果的示例代码
- 简单介绍HTML5中的文件导入jQuery+HTML5实现的页面整屏滑动切换效果源码html5实现的网格布局动画加载并打开内容特效源码html5实现的可拖拽图片循环滚动切换特效源码
- HTML5实现获取地理位置信息并定位功能HTML5地理定位_动力节点Java学院整理HTML5地理定位实例简单html5代码获取地理位置h5实现获取用户地理定位的实例代码
- 天天飞车怎么超车 各种超车技巧详解_手机游戏_游戏攻略_
- 天天飞车如何隐身 隐身技巧分享_手机游戏_游戏攻略_
- 全民英雄所有紫卡英雄成长值一览_手机游戏_游戏攻略_
- 全民英雄微信000暮色溶洞无法登录解决方法_手机游戏_游戏攻略_
点击排行
本栏推荐
