最近项目闲着没什么事,又想起了canvas, 针对移动端设备默认浏览器,做了点渲染方面效率的测试,手头设备不多(有一些低端机型和pc chrome做对比),现将测试数据分享给大家吧,本想和css3 animation动画一起测试比较一下,发现animation水的不行,效果跟canvas差很多(可能是因为我代码写的不好),webgl还没有普及到移动设备,所以也不做比较了,曾经看过一篇文章drawImage比putImageData效率低,但测试了一下drawImage的性能更好,还请大牛指导。测试使用cocos2dx的dancer做动画,全屏幕刷新,没使用脏矩形刷新,根据动画个数,屏幕缩放大小两方面测试(值为fps):

1 10 50 100 200 500 1000 1 20 50 100 200 500 1000 1 10 50 100 200 500 1000 1 10 50 100 200 500
320*200  V  V  V  V  V  V  V                                          
480*320                V  V  V  V  V  V                            
800*480                              V  V  V  V  V  V  V              
1024*800                                            V  V  V  V  V  V  V
chrome 75 75 75 75 73 46 46 75 73 72 67 62 41 26 61 59 58 56 53 34 20 29 29 29 29 27 21 14
chiwi v88 165 108 55 36 25 12 8 116 83 46 36 23 12 6 61 57 43 30 21 10 6 53 48 35 27 18 6 6
moto ME722 78 55 22 12 8 4 2 76 47 16 11 7 4 2 43 30 17 12 7 4 2 23 23 17 12 8 4 2
iphone 4 61 61 60 58 43 22 12 61 61 61 54 42 22 12 61 61 57 48 38 22 12 49 50 46 39 32 21 12
GALAXY SII 79 60 27 16 14 9 6 77 55 25 14 10 7 4 75 54 26 16 8 6 4 50 37 26 12 8 5 3

做了几张图方便大家对比:

不同分辨率(这里网页缩放使用meta标签适配全屏):

不同机型(chiwi v88为驰为v88,具体配置大家自查吧):

结果iphone必须是最牛的,貌似最高有60fps的渲染限制,以上测试仅供参考(仅仅是渲染部分,没有逻辑代码),希望能帮到大家(^-^)

后附部分代码(有些的不好的地方求指导)注释前部分是putImageData渲染,后部分是使用css3 animation

$(document).ready(function(e)
{
var canvas=document.getElementById("canvas");
var tag = document.getElementById("tag"); var sprite_info = {"s":"dance_atlas.png", 'w':85, 'h':120, 'f':[[0, 0], [85, 0], [170, 0], [255, 0], [340, 0], [0, 120], [85, 120], [170, 120], [255, 120], [340, 120], [0, 240], [85, 240], [170, 240], [255, 240]], "fd":[]}; var sprites=[]; var SPEED = 60; var image_data = null;
var image_ele = new Image();
var data = null;
var timestamp;
var fps = 60; var canvas_width = canvas.width;
var canvas_height = canvas.height;
var canvas_context = canvas.getContext('2d'); image_ele.src = sprite_info.s;
image_ele.onload = function()
{
var i = 0;
//getImageData();
while(i<1)
{
createParticles();
i++
}
start();
} function drawloop()
{
updateParticles();
drawParticles();
} /*function putloop()
{
updateParticles();
putParticles();
}*/ /*function getImageData()
{
canvas_context.drawImage(image_ele, 0, 0, image_ele.width, image_ele.height);
for(var index = sprite_info.f.length - 1; index > -1; index--)
{
var cf = sprite_info.f[index];
sprite_info.fd[index] = canvas_context.getImageData(cf[0], cf[1], sprite_info.w, sprite_info.h);
}
}*/ function createParticles()
{
var sp = Math.floor(Math.random() * SPEED);
sprites.push(
{
x: Math.floor(Math.random() * (canvas_width - sprite_info.w)),
y: Math.floor(Math.random() * (canvas_height - sprite_info.h)),
s: sp,
cs: 0,
i:0
});
} canvas.addEventListener('click',createParticles, false);
canvas.addEventListener('touchstart',createParticles, false); function updateParticles()
{
for(var index = sprites.length - 1; index > -1 ;index--)
{
var sprite = sprites[index];
if(sprite.cs == 0)
{
sprite.cs = sprite.s;
if(sprite.i == sprite_info.f.length - 1)
sprite.i = 0;
else
sprite.i++;
}
else
{
sprite.cs--;
}
}
} function drawParticles()
{
canvas_context.clearRect(0,0,canvas.width,canvas.height);
for(var index = sprites.length - 1; index > -1 ;index--)
{
var sprite = sprites[index];
var frame_i = sprite_info.f[sprite.i];
canvas_context.drawImage(image_ele, frame_i[0], frame_i[1], sprite_info.w, sprite_info.h, sprite.x,sprite.y, sprite_info.w, sprite_info.h);
}
} function putParticles()
{
canvas_context.clearRect(0,0,canvas.width,canvas.height);
for(var index = sprites.length - 1; index > -1 ;index--)
{
var sprite = sprites[index];
var frame_i_d = sprite_info.fd[sprite.i];
canvas_context.putImageData(frame_i_d, sprite.x,sprite.y);
}
} var requestAnimationFrame = window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || function(func){setTimeout(func, 0);},
startTime = window.mozAnimationStartTime || Date.now(), fra = 0; function updateProgress(){
drawloop();
var drawStart = (timestamp || Date.now());
fra++;
if(drawStart - startTime > 1000)
{
tag.innerText = "fps:" + fra;
startTime = drawStart;
fra = 0;
}
if (true){
requestAnimationFrame(updateProgress);
}
} function start()
{
requestAnimationFrame(updateProgress);
} /* var pnl = document.getElementById("app");
var SPEED = 10;
var spy = null;
var fps = 60; var r_time = Math.floor((1000 / fps) * 14); function createParticles()
{
var new_dancer = document.createElement("div");
var inner = document.createElement("div");
new_dancer.appendChild(inner);
pnl.appendChild(new_dancer);
new_dancer.style["left"] = Math.floor(Math.random() * (/(\d+)px/.exec(pnl.style["width"])[1] * 1 - sprite_info.w)) + 'px';
new_dancer.style["top"] = Math.floor(Math.random() * (/(\d+)px/.exec(pnl.style["height"])[1] * 1 - sprite_info.w)) + 'px';
//var sp = Math.floor(Math.random() * SPEED);
inner.style['-webkit-animation-duration'] = r_time + 'ms';
sprites.push(new_dancer);
spy = new_dancer;
} var drawStart, startTime = Date.now(), fra = 0, timestamp; function updateProgress(){
debugger;
var drawStart = (timestamp || Date.now());
fra += 14;
if(drawStart - startTime > 1000)
{
debugger;
tag.innerText = "fps:" + fra;
startTime = drawStart;
fra = 0;
}
} function start()
{
var i = 0;
while(i<100)
{
createParticles();
i++
}
spy.addEventListener("webkitAnimationIteration", updateProgress, false);
} start();*/ });

html5 canvas移动设备渲染测试的更多相关文章

  1. 基于 HTML5 Canvas 的 3D 渲染引擎构建机架式服务器

    前言 今天找到了 HT 的官网里的 Demo 网站( http://www.hightopo.com/demos/index.html ),看的我眼花缭乱,目不暇接. 而且 HT 的用户手册,将例子和 ...

  2. 基于 HTML5 Canvas 的 3D 渲染引擎构建生产管控系统

    前言 大家好,老郑我又回来了.这一期为大家带来一个非常好玩的 demo,我们制作一套自己的 3D 管道控制系统,运用了( http://www.hightopo.com )HT 的 Graph3dVi ...

  3. 提高HTML5 canvas性能的几种方法

    简介 HTML5 canvas 最初起源于苹果(Apple)的一项实验,现在已经成为了web中受到广泛支持的2D快速模式绘图(2Dimmediate mode graphic)的标准.许多开发者现在利 ...

  4. 使用HTML5 -Canvas追踪用户,Chrome隐身模式阵亡

    中国的一些精准营销公司又要偷着乐了= =从之前追踪Cookie到后面追踪FlashCookie,某些商家总在永无止境的追踪用户行为甚至是隐私,将其转化为所谓的“商业价值”.我们被迫面临“世风日下.道德 ...

  5. html5 canvas 画图移动端出现锯齿毛边的解决方法

    使用HTML5的canvas元素画出来的.在移动端手机上测试都发现画图有一点锯齿问题 出现这个问题的原因应该是手机的宽是720像素的, 而这个canvas是按照小于720像素画出来的, 所以在720像 ...

  6. 基于html5 canvas 的客户端异步上传图片的插件,支持客户端压缩图片尺寸

    /** * Created by xx on 15-05-28. * 基于html5 canvas 的客户端异步上传画片的插件 * 在实际应用中,常常要用于上传图片的功能.在现在越来越多的手机weba ...

  7. HTML5 Canvas,WebGL,CSS Shaders,GLSL的暧昧关系

    一.前面的所以然 技术的发展日新月异,说不定回家钓几天鱼,就出来个新东西了.新事物新技术发展的初期,你无法预见其未来之趋势,生命诚可贵,没有必要花过多时间深入研究这些新东西,不过,知道了大概,了解个全 ...

  8. HTML5 Canvas,WebGL,CSS Shaders,GLSL的暧昧关系 【转】

    HTML5 Canvas,WebGL,CSS Shaders,GLSL的暧昧关系 这篇文章发布于 2011年10月10日,星期一,17:14,归类于 canvas相关. 阅读 58013 次, 今日 ...

  9. HTML5 Canvas游戏开发实战 PDF扫描版

    HTML5 Canvas游戏开发实战主要讲解使用HTML5 Canvas来开发和设计各类常见游戏的思路和技巧,在介绍HTML5 Canvas相关特性的同时,还通过游戏开发实例深入剖析了其内在原理,让读 ...

随机推荐

  1. BZOJ 1029: [JSOI2007]建筑抢修 贪心

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1029 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落 ...

  2. UML 2.0(装载)

    在世界上统一建模语言UML2.0是完全不同的维度.它在本质上更加复杂和广泛. 与UML1.5版本相比,文件的程度也增加了. UML2.0中还增加了新的功能,所以它的使用可以更广泛. UML2.0将正式 ...

  3. 【ASP.Net MVC】在AspNet Mvc使用JQuery AutoComplete组件

    在AspNet Mvc使用JQuery AutoComplete组件 官方文档: http://api.jqueryui.com/autocomplete/#entry-examples 要使用JQu ...

  4. ASP.NET运行机制之一般处理程序(ashx)

    一. 概述 新建一个ashx文件  代码如下 <%@ WebHandler Language="C#" Class="TestHandler" %> ...

  5. static_cast和reinterpret_cast

    static_cast和reinterpret_cast 相同点:都是暴力转换,从一个类型转换为另一个类型,对于类指针不会保证安全性   static_cast和reinterpret_cast的区别 ...

  6. JavaScript 性能分析新工具 OneProfile

    OneProfile 是一个网页版的小工具,可以用全新的方式展示 JavaScript 性能分析的结果,帮助开发者洞悉函数调用关系,优化应用性能. 点击打开 OneProfile 背景 Chrome ...

  7. HDU 1558 Segment set (并查集+线段非规范相交)

    题目链接 题意 : 如果两个线段相交就属于同一集合,查询某条线段所属集合有多少线段,输出. 思路 : 先判断与其他线段是否相交,然后合并. #include <cstdio> #inclu ...

  8. 可任意自定义的 UITableViewCell

    可任意自定义的 UITableViewCell UITableView的强大更多程度上来自于可以任意自定义UITableViewCell单元格.通常,UITableView中的Cell是动态的,在使用 ...

  9. UITableViewCell的重用机制原理

    UITableViewCell的重用机制原理 来自http://blog.csdn.net/omegayy/article/details/7356823 ====================== ...

  10. LevelDB系列之整体架构

    LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口.为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动态角度.从静态角度,可以假想整个系 ...