最近项目闲着没什么事,又想起了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. 事务并发处理: DB+ORM+逻辑代码

    在学习了马士兵有关事务并发处理的视频后, 感觉对事务并发处理的概念,问题以及解决方式有了一定的了解,赶紧记录下来以备后用. 1. 事务:一系列操作要么都完成,要么一个都不完成 2. 事务并发:多个事务 ...

  2. java 解决JFrame不能设置背景色的问题 分类: Java Game 2014-08-15 09:48 119人阅读 评论(0) 收藏

    这段时间比较多,于是写一写JAVA的一些IT技术文章.如有JAVA高手请加QQ:314783246,互相讨论. 在Java的GUI设计中,Frame和JFrame两者之间有很大差别,上次刚学时编一个窗 ...

  3. Windows10+IIS7.5上如何配置PHP站点

    最近我一直在写PHP,但是我很喜欢微软的开发环境和Windows的硬件环境,我就想在IIS上配置一下PHP站点,这样用起来也比较方便,在经过各位前辈的文章学习后,自己整理了一个比较简单的图片为主的教程 ...

  4. 一个包的net到gs流程

    再来看看一个包走共享内存的流程 先来看看net进程这块如何处理的 {//用shareData这种类型封装刚才从无锁队列中取到的包 shareData sd; sd.channel_id = pkt.c ...

  5. protobuf的安装和使用

    以下全部基于win7系统. protobuf是什么,有什么用网上说的已经很多了.这里就是说一下怎么使用.就当给自己做个笔记吧. .proto文件的语法什么的也请网上查看,挺多的. 第一步: 下载pro ...

  6. [百度空间] [转]DLL地狱及其解决方案

    DLL地狱及其解决方案 原作者:Ivan S Zapreev 译者:陆其明概要 本文将要介绍DLL的向后兼容性问题,也就是著名的“DLL Hell”问题.首先我会列出自己的研究结果,其中包括其它一些研 ...

  7. 为了让vi命令也可以使用vim的配置,需要修改 vi /etc/bashrc 增加一行 alias vi='vim'此时,经过上面配置已经可以显示语法高亮了

    为了让vi命令也可以使用vim的配置,需要修改 vi /etc/bashrc 增加一行 aliasvi='vim'此时,经过上面配置已经可以显示语法高亮了

  8. 移动端页面调试工具——UC浏览器开发者版

    在移动页面的开发中,我们很难像PC端那样很方便的调试,网上也有各种各样的调试方式.但在工作中,我主要还是用chorme自带的模拟器来模拟各种移动设备,但是用久了之后发现毕竟是模拟的,与真机调试还是会有 ...

  9. 偶然发现的一个地图网站mapbox

    https://www.mapbox.com/ 可以自定义地图,并放到dropbox中.时间有限,更多功能有待发现 可以用他的切片 http://a.tiles.mapbox.com/v3/jambo ...

  10. 由浅入深了解Thrift之结果封装

    一.thrift返回结果封装 Thrift文件添加版本号,方便对thrift的版本进行控制 服务与返回的数据类型分开定义 在项目中使用Thrift提供RPC服务时,很多情况下我们都会将返回的结果进行封 ...