`

【更新】一个HTML5 Canvas 2D & Dom 动画的demo 兼 性能测试.

阅读更多
这个demo很简单:

50个小人(10*5的方阵), 从场地(800*600)左边走到右边 然后折回, 循环反复.

截图如下:



这只是一个简单的动画, 代码中实现了 animation sprite timer game-mainloop
等几个核心的模块(还很粗糙).

如果要扩展成一个游戏引擎, 还要做比较多的工作.

希望这个小demo 可以给那些希望用html5 来实现动画和游戏的朋友一些帮助.

========================
更新内容

对代码进行了重构 现在可以用Dom来实现人物(Sprite)的动画了.
实际测试后, 在当前场景下 性能确实更高.


如果不能下载附件,可以去这下载:
http://u.115.com/file/f7b24dd5ad
========================

查看方法:
用支持html5 canvas的浏览器打开 bench.html文件,
想测试用dom模拟的动画, 可以打开 bench_dom.html (支持IE6)

然后点击 start按钮即可.

注意: 这个测试比较耗费CPU资源, 因为主循环间隔设置的是2毫秒.

===================================================


同时还请大家帮个忙,
帮忙测试一下 这个动画 在你们的机器和浏览器上 的每秒帧数 (左上角变动的数字)
并把结果反馈给我谢谢了.

反馈信息越详细越好,最好包括:
机器CPU主频/核数 操作系统 浏览器版本,
是否开启GPU加速(如果开启的话 那么机器的显卡是什么)

谢谢大家了.

先说一下我的:
CPU : 奔腾 Dual-core, 1.86G
内存 : 2G
OS : win xp sp3
结果:
chrome 10  FPS: 105左右
firefox 3.6  FPS: 18左右

分享到:
评论
14 楼 suolan 2011-03-17  
win7 ie9正式版 2G i5

cpu 只占2-3%

而且发现个问题,貌似IE9在最小化或隐藏情况下cpu资源会释放掉,FF和chrome就差一些。莫非微软这回真得给力了???

(要在文档头加上<!DOCTYPE html>不然IE9不认,这也说明微软这次真得的是超级无奈支持html5,否则按照ie原来的代码兼容习惯肯定能过)
13 楼 cuixiping 2011-01-04  
fins 写道
to 9 楼 :

6楼的观点中 80%都是错误的

6楼自己已经认识到他的错误了, 你还在这里说"是这样的"...囧...

之前和6楼在群里也有讨论,
在这个场景中 用dom肯定会快
但是原因不是他写的那些

我们不能根据结果来反过来想原因.

我本意主要是指“setinterval和settimeout时间不准”的问题的确存在。
也许,我是说也许,在你的机子上setinterval(fn,0), setinterval(fn,5), setinterval(fn,10) 的效果是一样的。为什么说是也许呢,因为我实测发现,
这个跟电脑的速度有关,你的cpu高,空闲资源越多,这个定时就能更小。
12 楼 yorkane 2010-12-24  
winxp Dell 6500
intel core2 duo 2.4GHZ 4G RAM

Chrome9 bench_dom.html 205-220
Chrome9 bench.html 150-165

Firefox3.6 bench.html 65-75
Firefox3.6 bench_dom.html 85-95

11 楼 ice.k 2010-12-24  
X201 I5-540
bench.htm Chrome 10 190左右
bench_dom.html Chrome 10 240左右
10 楼 fins 2010-12-23  
to 9 楼 :

6楼的观点中 80%都是错误的

6楼自己已经认识到他的错误了, 你还在这里说"是这样的"...囧...

之前和6楼在群里也有讨论,
在这个场景中 用dom肯定会快
但是原因不是他写的那些

我们不能根据结果来反过来想原因.
9 楼 cuixiping 2010-12-22  
gongxiaohu 写道
我是群里的晓浒
其实setinterval和settimeout都有默认最小刷新速率,传递时间为0测试空代码的fps结果
ie        60  
chrome10  250
ff4       100
但是这些都不是系统最高速度,而是不同浏览器的js引擎限制死的。
你可以同时写多个setinterval(fn,0)来测试,发现每个都能达到默认最高的fps(例如chrome10中每个setinterval都能达到250的fps).

所以在js中按照一般游戏框架写统一的interval或者timeout刷新是达不到最高效能的,应该每个需要渐变的过程都是一个单独的interval和timeout。

因为canvas相关函数调用是阻塞式的.所以效率不及dom相关操作
ctx.drawImage(...)  ->会阻塞js引擎代码,直到返回
dom.style.left+=1;  ->单纯的加法很快,js引擎会继续执行下去。真正的渲染引擎是在另外一个线程中,不会阻塞js的执行。

性能方面的第二个原因是canvas的img对象其实每次都是需要构造一个html dom的Image对象的,然后才能进行操作。

这段动画如果通过dom的background切换做动画,改变left,top的值做移动,理论fps是满值的,直到渲染器的速度跟不上js代码的速度为止.

是这样的
8 楼 fins 2010-12-22  
另一个朋友:

chrome 160左右
firefox30左右
CPU 奔腾双核E6500 3.93GHz
内存4G winxp
7 楼 fins 2010-12-22  
回6楼 :

你的说法是错误的.
错误原因我已经在群里和你说过了 呵呵.
6 楼 gongxiaohu 2010-12-21  
我是群里的晓浒
其实setinterval和settimeout都有默认最小刷新速率,传递时间为0测试空代码的fps结果
ie        60  
chrome10  250
ff4       100
但是这些都不是系统最高速度,而是不同浏览器的js引擎限制死的。
你可以同时写多个setinterval(fn,0)来测试,发现每个都能达到默认最高的fps(例如chrome10中每个setinterval都能达到250的fps).

所以在js中按照一般游戏框架写统一的interval或者timeout刷新是达不到最高效能的,应该每个需要渐变的过程都是一个单独的interval和timeout。

因为canvas相关函数调用是阻塞式的.所以效率不及dom相关操作
ctx.drawImage(...)  ->会阻塞js引擎代码,直到返回
dom.style.left+=1;  ->单纯的加法很快,js引擎会继续执行下去。真正的渲染引擎是在另外一个线程中,不会阻塞js的执行。

性能方面的第二个原因是canvas的img对象其实每次都是需要构造一个html dom的Image对象的,然后才能进行操作。

这段动画如果通过dom的background切换做动画,改变left,top的值做移动,理论fps是满值的,直到渲染器的速度跟不上js代码的速度为止.
5 楼 jasongreen 2010-12-21  
archlinux
intel T200 2.0

firefox 3.6 50-70 fps
firefox 4.0pre8 82-88 fps (很稳定)
4 楼 fins 2010-12-21  
CPU负荷高 是因为主循环之间的间隔我设置的太小了 (为了测试出极限效果 呵呵)

对于这个动画而言, SLEEP设置成15--25之间都可以接受.

可以去bench.html里 修改变量 SLEEP 的值.
3 楼 jasongreen 2010-12-21  
cpu占用 50%-70%
2 楼 jasongreen 2010-12-21  
archlinux
intel T7200 2.0G
chrome 9.0.597.0
memory 3G
120 - 140 fps, 开始的时候曾经160,后面稳定在120-140,cpu占用在50%,windows下相当于25%
1 楼 fins 2010-12-21  
另一个朋友的测试结果

32位WIN7, E2140,1.6G双核,CHROME 10.0.612.1,4G内存

大约在100~150

相关推荐

    基于HTML5Canvas的轻量级游戏引擎Laro.zip

    Laro 是一个基于html5 canvas的用于平面2d或者2.5d游戏制作的轻量级游戏引擎。 因为当前canvas作为画布形态的dom元素,并提供了大量关于矢量图以及texture绘制的api,但是由于其本身提供的api太过于底层,在类似游戏...

    汽车仪表盘canvas动画.zip

    HTML5的Canvas元素是网页开发中的一个强大工具,它允许开发者在网页上绘制图形,创建动态视觉效果。在这个“汽车仪表盘canvas动画.zip”压缩包中,包含了一个使用纯JavaScript编写的汽车仪表盘插件,没有依赖jQuery...

    javascript(html5 canvas)做的拼图游戏,简单易懂

    Canvas是HTML5的一个核心特性,它提供了一个在网页上绘制2D图形的API。通过JavaScript,开发者可以控制Canvas元素,画线、填充形状、绘制图像等,实现了动态、实时的图形渲染。在这个拼图游戏中,Canvas被用来绘制...

    PC动画Demo(HTML+CSS+JavaScript)

    Canvas是HTML5的一个重要特性,它是一个可编程的2D画布,允许开发者通过JavaScript进行像素级别的图像操作。在这个项目中,canvas可以用于创建更复杂的动画效果,如粒子系统、矢量图形动画或者实时图形渲染。通过...

    cocos2d-html5简介.pdf

    Cocos2D-HTML5是一个基于HTML5规范的2D游戏引擎,由Cocos2D-X团队主导开发,旨在提供跨平台的游戏开发解决方案。它的主要特点是开源,采用MIT协议,允许开发者在多个平台上复用代码。Cocos2D-HTML5不仅支持PC浏览器...

    基于canvas操作图像、视频实现弹性照片墙.zip

    在前端开发中,创建引人入胜且富有个性的用户界面是至关重要的,"基于canvas操作图像、视频实现弹性照片墙"就是一个很好的实践案例。这个项目利用HTML5的Canvas元素来动态展示和操作图片和视频,构建出一个具有弹性...

    前端实现一个点名demo

    在前端开发中,实现一个点名demo涉及到的主要技术是JavaScript,一种广泛用于网页和网络应用的脚本语言。这个项目的核心目标是通过编程使小球在界面上移动,并且当小球与其他元素碰撞时,随机显示出一个人的名字。...

    基于HTML5、vue和WebKit的简单的图像采集处理demo.zip

    本示例"基于HTML5、Vue和WebKit的简单图像采集处理Demo",主要展示了如何利用HTML5的新特性,结合Vue.js框架和WebKit浏览器引擎,实现一个图像采集和处理的前端应用。这个应用对于理解HTML5多媒体处理、前端图像处理...

    超酷HTML5 3D线条凹凸人物头像动画特效

    HTML5是一种强大的网页开发技术,它为Web开发者提供了丰富的功能和接口,使得...对于学习和研究Web前端开发的人员来说,这是一个很好的学习案例,有助于提升对HTML5 Canvas、CSS3动画以及JavaScript交互处理的理解。

    HTML5兼容电脑手机端3D翻页电子书特效.zip

    2. **Canvas元素**:HTML5的Canvas是一个基于矢量图形的画布,通过JavaScript可以绘制2D和3D图形。在这个3D翻页效果中,Canvas可能是实现动态翻页动画的关键。 3. **WebGL**:WebGL是HTML5的一个扩展,允许在浏览器...

    html5 黑洞效果js 黑洞资源特效.rar

    在本压缩包“html5 黑洞效果js 黑洞资源特效.rar”中,我们聚焦于HTML5的Canvas元素,这是一个用于图形绘制的二维画布,允许通过JavaScript动态创建和修改图像。这个资源包包含了一个炫酷的宇宙黑洞引力特效,可以...

    HTML+JS实现贪吃蛇demo

    【HTML+JS实现贪吃蛇demo】是一个使用HTML和JavaScript技术构建的小型在线游戏,它重现了经典的“贪吃蛇”玩法。这个项目是初学者和有经验的开发者学习网页交互和JavaScript编程的一个好例子。下面我们将深入探讨...

    Jquery图表简单Demo

    jQuery 是一个高效、简洁、强大的JavaScript库,它简化了HTML文档遍历、事件处理、动画和Ajax交互。其简洁的API使得JavaScript编程变得更加容易。 2. **选择图表库** 在这个Demo中,可能使用的是像`Chart.js`或`...

    纯js的k线图demo,可以直接运行测试

    在这个纯JS的K线图demo中,开发者提供了一个可以直接运行并测试的实例,这对于学习和理解如何用JavaScript实现K线图功能非常有帮助。以下是对这个项目涉及的知识点的详细解释: 1. **K线图**:K线图,又称蜡烛图或...

    html5 手机场景应用场景特效

    1. **Canvas**: HTML5的Canvas元素是一个可编程的画布,通过JavaScript可以绘制2D图形,非常适合创建动态视觉效果和游戏。在手机场景应用中,Canvas可以用于制作图表、动画、小游戏等。 2. **SVG(Scalable Vector ...

    Three.js前端3D开发:使用CSS3DRenderer渲染全景图

    在前端开发领域,Three.js 是一个非常流行的 JavaScript 库,用于创建和展示3D图形。在本主题中,我们将深入探讨如何使用 Three.js 的 CSS3DRenderer 来渲染全景图,这是一种将3D对象与CSS3变换相结合的技术,能够...

    jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】

    本文将介绍如何使用jQuery和HTML5的WebGL特性来创建一个高性能的烟花绽放动画。WebGL是一种基于OpenGL标准的JavaScript API,它允许在浏览器中进行3D图形渲染,而无需插件。 首先,我们需要了解HTML5的`&lt;canvas&gt;`...

    js特效代码大全

    9. **canvas绘图**:HTML5的canvas元素提供了一种在网页上绘制图形的方式,通过JavaScript可以创建复杂的2D动画和游戏特效。 10. **WebGL**:对于3D效果,WebGL提供了在浏览器中进行硬件加速的3D图形渲染。Three.js...

Global site tag (gtag.js) - Google Analytics