关于特效性能,canvas、css3、jquery那个更适合手机端?
时间:2021-07-01 10:21:17
帮助过:10人阅读
关于特效性能,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强。