关于特效性能,canvas、css3、jquery那个更适合手机端?
最近用dom+jquery做了一个移动端的应用,有6个页,其中有一些诸如齿轮转动,繁星乱跑之类的效果,做好后发现性能真的很差,随后改为css3+canvas的结构,还是不怎么样,最后没办法了,全部推翻重做,使用lufylegend引擎全部采取canvas写完了整个应用,虽然勉强可以用了,但是在一些方面还是不尽如意,比如不好绑定鼠标事件,性能还是有些卡顿。那么,到底该采用什么方法来做这一系列的页面呢?
回复内容:
提一个不同的观点。
用css3动画,也就意味着需要依赖dom,动画都是作用在dom上的。而移动浏览器上的dom性能真是低下,因为这里面涉及到排版引擎,你只能通过减少节点和操作去规避问题,却很难解决。
而canvas动画把整个画布的控制权交给你了,动画性能的上限也由程序员来把握。
有人说canvas动画性能不如css3动画,在排版引擎不成为瓶颈的情况下是成立的,毕竟css3动画更方便,更与内容分离。但不要忘了,css3动画虽然不占用js主线程,却受排版引擎的限制,与整个页面的dom结构息息相关。你想想,假如dom真是万能的话,canvas是用来做啥的呢?事实上,像素操作比dom操作性能要高得多,就连2048这样简单的游戏,用dom来写,在手机上都觉得css3动画帧率不行了,我基本上只敢用dom来做找茬这样的无动画游戏。
总结,dom和css3动画是用来给内容布局加上特效的通用解决方案,在性能堪忧的移动浏览器上很可能会受排版性能所限,达不到理想的效果。而对性能有要求的特定场景,比如游戏,用canvas会有很大的提高,如果觉得事件和坐标管理麻烦的话,可以用一个好一些的游戏引擎。对于大量创建销毁对象的情况,例如打飞机游戏,你可能还需要用到对象池,毕竟js gc的开销也是够呛。
不考虑代码质量的话,一般来说css3>canvas>纯js。
1. css3动画是独立与js线程的,js的运算操作不会阻塞css3的动画,所以在系统cpu占用率较高的时候,css3的动画性能要明显高于纯js的动画。
2. 纯js,请注意“
纯”这个字,它的意思是js操作dom,而不是canvas。通过js操作dom实现的动画会引起浏览器的recalculate和layout,在移动设备上还会引起rasterize(栅格化),题主列出的三种动画比较,为什么说纯js的动画性能最低呢,原因就是纯js实现的动画不仅仅考验开发人员的js代码质量,而且随着动画复杂度的提高,被操作的dom数量的提高,相较于css3和canvas来说,纯js实现的动画性能越低。
3. canvas相对于纯js来说dom结构要简单很多,引起的recalculate和layout自然就少了很多,但canvas的动画仍然需要js代码驱动,占用js线程,所以,相较于css3来说,性能上仍然略逊一筹。
PS:虽然理论上是这样,但实际开发中往往还要考虑很多其他因素,比如兼容性(移动端同样不可避免,WTF!),所以很多时候往往采用折中或者综合的方法。
css永远好于js
纯js永远好于jq
canvas没什么研究,但本质也是js。操作dom的成本最大,canvas估计比js操作dom强。
Statement:The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn