【原创】测试不同浏览器播放canvas动画的平滑程度

Canvas无疑是HTML5开放式网络平台最激动人心的技术之一。目前,除了IE8以外,各类浏览器的新版本都支持HTML5 Canvas。

程序员需要通过Javascript调用Canvas API。基本的Canvas API包括一个2D环境,该环境允许程序员绘制各种图形和渲染文本,并将图像显示在浏览器窗口的定义区域。实现Canvas动画时,程序员需要在下一帧渲染前设置屏幕内容,重绘图像以实现动画效果。Canvas动画的实现有点儿像“翻页动画”,在绘本上的每页绘制不同图像,快速翻过时每一帧都连续起来,看上去像动画片。因此对于Canvas来说,如果“浏览器翻页不够快”或者“浏览器播放Canvas不够平滑”,就会出现跳帧的情况,让用户感觉卡壳。

下文将通过一个案例显示不同浏览器播放canvas动画的平滑程度,并分享不同设备及浏览器上的测试数据。

代码框架来源于Anthony T.Holdener和Mario Andres Pagella所著的《深入HTML5应用开发》一书,细部有修正。基本思想是创建一个只有两帧的动画,让浏览器在10秒钟的时间内尽可能绘制,最后计算每秒平均执行的动画帧数。平均帧数越高,则证明浏览器播放Canvas动画的平滑程度越好。

 1 <!DOCUTYPE HTML>
 2 <html>
 3 <head>
 4 <!--将使用中文在Canvas上绘制文字-->
 5 <meta charset="gb2312"/>
 6 <!--设置viewport,保证浏览器在移动设备上读取到Ideal Width-->
 7 <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,scalable=0" />
 8 <title>FPS Test</title>
 9 <style type="text/css">
10 html{height:100%;overflow:hidden;}
11 body{height:100%;padding:0px;margin:0px;}
12 </style>
13 </head>
14 <body>
15 <!--测试浏览器是否支持Canvas-->
16 <canvas id="screen" >You Browser does not support HTML5 canvas.</canvas>
17 <script type="text/javascript">
18 window.onload = function(){
19 var sc=document.getElementById("screen");
20 sc.width=document.body.clientWidth;
21 sc.height=document.body.clientHeight;
22 var g=sc.getContext("2d");
23
24 var fpsArray=[];//新建帧数组,记录浏览器每秒执行帧数
25 var fpsRound=0; //新建帧数计算器
26 var fps=0;
27
28 var date=new Date();
29 var startTime=Math.round(date.getTime()/1000);//计算自1970年1月1日到目前为止的毫秒数,取整为秒
30 draw(startTime);
31
32 function draw(stTime){
33 var date=new Date();
34 var anotherTime=Math.round(date.getTime()/1000);
35
36 if(stTime!=anotherTime){//是否已进行到下一秒
37 fps=fpsRound;
38 fpsRound=0;
39 fpsArray.push(fps);//结果为是,将浏览器在上一秒执行的帧数插入数组
40 }else{
41 fpsRound++;//结果为否,继续增加帧数
42 }
43
44 //用Canvas绘制简单的黑屏和白屏做为动画的两帧
45 g.fillStyle="#000";
46 g.fillRect(0,0,sc.width,sc.height);
47
48 g.fillStyle="#fff";
49 g.fillRect(0,0,sc.width,sc.height);
50
51 /**测试使用,执行时可以删除
52 console.log("当前时间是"+anotherTime);
53 console.log("当前帧数为"+fpsRound);**/
54
55 if(anotherTime<(startTime+10)){//浏览器执行10秒钟
56 setTimeout(function(){draw(anotherTime)},1);
57 }else{
58 showResult();
59 }
60
61 function showResult(){
62 var sum=0;
63 var mean=0;
64 var a;
65
66 //取得数组数值,从小到大进行排序
67 for(var i=0;i<fpsArray.length;i++){
68 for(var j=fpsArray.length-1;j>i;j--){
69 if(fpsArray[i]>fpsArray[j]){
70 a=fpsArray[j];
71 fpsArray[j]=fpsArray[i];
72 fpsArray[i]=a;
73 }
74 }
75 }
76
77 //排序后显示
78 for(var i=0;i<fpsArray.length;i++){console.log("数组的第"+i+"个元素是:"+fpsArray[i]);}
79 for(var i=0;i<fpsArray.length;i++){sum=sum+fpsArray[i];}
80 mean=(sum/10);
81
82 //根据设备屏宽设置文字大小并显示
83 var fontSize=0.03*sc.width;
84 g.font="italic bold "+fontSize+"px serif";
85 g.fillStyle="#000";
86 g.fillText("经测试,该浏览器10秒内可执行的帧数总量为:"+sum,40,50);
87 g.fillText("经测试,该浏览器每秒平均可执行帧数为"+mean,40,100);
88 g.fillText("设备屏宽为:"+sc.width,40,150);
89 }
90 }
91 }
92 </script>
93 </body>
94 </html>

将上述代码在不同设备和浏览器中各测试10次,结果如下(FPS为10秒平均数):

以上测试结果均为浏览器不发出其他网页请求,仅执行上述代码情况下完成。

Win7系统上,IE11支持Canvas动画的平滑程度最高,其次是Chrome、UC浏览器和FireFox。

Android 4.4.4系统上,Chrome支持Canvas动画的平滑程度最高,其次是Android自带浏览器、FireFox、Opera和UC浏览器。

Ipad 6.1.2系统上,safari对Canvas动画平滑程度的支持要低于Android4.4.4系统上的其他浏览器。

参考文献:

[1] Steve Fulton & Jeff Fulton.HTML5 Canvas 开发详解.[M].O‘Reilly Media,Inc.2013;

[2]Anthony T.Holdener & Mario Andres Pagella.深入HTML5应用开发.[M].O‘Reilly Media,Inc.2011;

【欢迎交流:) 】

时间: 2024-10-16 22:58:30

【原创】测试不同浏览器播放canvas动画的平滑程度的相关文章

7 个顶级的 HTML5 Canvas 动画赏析

HTML5确实是一项改革浏览器乃至整个软件行业的新技术,它可以帮助我们Web开发者很方便地在网页上实现动画特效,而无需臃肿的Flash作为支撑.本文分享7个顶级的HTML5 Canvas 动画,都有非常不错的效果. 1.3D HTML5 Logo动画 HTML5多视角3D旋转动画 HTML5 3D动画实现起来非常方便,之前介绍过基于jQuery的3D旋转插件是利用多张多视角图片播放来实现的,而今天分享的这款HTML5 3D旋转动画是利用纯HTML5技术实现的,该动画实现了HTML5 Logo旋转

canvas动画:自由落体运动

经过前面的文章,我们已经能够在canvas画布上画出各种炫酷的图形和画面,但是这些画面都是禁止的,怎么样才能让他们动起来呢? 如何绘制基本图形可以参考:canvas基本图形绘制 如何对基本图形移动旋转缩放可以参考:canvas图形变换 如何设置基本图形颜色和样式可以参考:canvas样式和颜色 如何使用外部图片以及图形组合可以参考:canvas使用图片,图形组合以及裁剪 canvas如何保存和加载图像可以参考:canvas图像保存 canvas系列教程可以参考:canvas 动画的基本步骤 我们

android 拓展ImageView播放GIF动画

原生Android控件ImageView并不能支持播放GiF格式的图片.如果将一张GIF的图片放入ImageView中,它只会显示图片的第一帧,不会产生任何动画效果. Android中播放GIF动画实现方法还是用多种的,最常用的就是使用   Frame动画, 但局限性较多,所以下面用一种拓展的ImageView实现效果. 1.要用到自定义控件,就要使用自定义控件的属性,因此需要在values下新建一个attrs.xml,可以为这个文件中添加任何需要自定义的属性. 这里只需要一个auto_play

能够播放gif动画的ImageView

一般ImageView并不能播放gif动画. 此处播放gif动画的核心是: 1.将gif中的每一帧拿出来,然后使用Movie类的setTime()和draw()这两个方法来实时的画界面. 2.在ondraw中来处理这些绘制操作.进行逻辑推断,是否自己主动播放,假设不是自己主动播放的话就须要绘制一个開始button,同事设置画面定位到gif动画的第一帧 其它在代码中查看.主要类GifImageView.java凝视比較全.应该看懂问题不大. 注意的是,须要values目录下创建attrs,由于须要

7个惊艳的HTML5 Canvas动画效果及源码

HTML5非常强大,尤其是现在大部分浏览器都支持HTML5和CSS3,用HTML5制作的动画也多了起来.另外,Canvas上绘制图形非常简单,本文就分享了一些强大的HTML5 Cnavas动画,一起来看看. 1.HTML5 Canvas瀑布动画 超逼真 这是一个很逼真的HTML5瀑布动画,基于Canvas实现的,效果相当酷. 在线演示   /   源码下载 2.HTML5 Canvas彩色像素进度条动画 这也是一款基于HTML5 Canvas的动画特效,它是一个很有创意的HTML5进度条,大家可

可以播放gif动画的ImageView

一般ImageView并不能播放gif动画. 此处播放gif动画的核心是: 1.将gif中的每一帧拿出来,然后使用Movie类的setTime()和draw()这两个方法来实时的画界面. 2.在ondraw中来处理这些绘制操作.进行逻辑判断,是否自动播放,如果不是自动播放的话就需要绘制一个开始按钮,同事设置画面定位到gif动画的第一帧 其他在代码中查看,主要类GifImageView.java注释比较全,应该看懂问题不大. 注意的是,需要values文件夹下创建attrs,因为需要自定义属性au

多浏览器播放wav格式的音频文件

html5的audio标签只在火狐下支持wav格式的音频播放,无法兼容IE和google , 使用audioplayer.js 基本上能支持大部分浏览器播放wav音频文件,经测试IE.火狐.google浏览器都可以播放wav格式的音频 当audio标签不支持或者audio不能播放相应格式的文件时,播放器将使用迷你模式,使用embed元素来播放音频,功能支持将较少 使用方法: 1.html中加入audio标签 <audio controls="controls" id="

探究浏览器播放视频

浏览器播放视频,分为两种: 一.内联视频(Inline Videos) 当视频被包含在网页中,或作为网页的一部份,它就被称为内联视频.通过使用 <img> 元素,可向网页添加内联视频.许多人,对这内联视频是很反感的.就好比,大半夜大家都睡了.突然打开一个页面蹦出视频来,吓老子一跳!我找到资料时,突然某个网页吱哇乱叫!还以为打开小网站了呢.所以有的已经关闭了内联视频,笔者建议仅仅在用户希望听到声音的地方包含内联视频.比方说在用户打开页面后,点击某个链接来观看视频,看看某人的空间听听音乐.①使用

《每周一点canvas动画》——用户交互

用户交互也许是我们学习canvas动画中首先需要掌握的部分.毕竟,如果没有交互或者向动画中做一些动态的输入,那么这跟看电影有什么区别呢?用户交互基于事件,一般来说包括:鼠标事件,触摸事件和键盘事件. 1.事件和事件执行 在理解事件之前,你需要明白什么是listener和handler.listener(即监听器)决定当一个事件发生时是否做出反应.handler(即执行者)是一个函数,当事件发生时被调用.好了,扯了这么多直接上代码: element.addEventListener(type, h