Android应用优化(4)浅谈动画和帧率

前几天帮同事看了一个问题,就是做了一个时间助手的应用,包括了一个模拟时钟一个计时器,单独动画看着还ok,但是在ViewPager中滑动就出现了滑不动和卡顿的情况。
首先,建议他把view换成surfaceview来实现,发现这样不仅没有解决问题,反而把其他fragment的界面变得滑动卡顿了。
然后,仔细分析了一下代码,发现主要原因是他在实现时钟的旋转时不停的创建图片和旋转图片,这才是问题的关键。
这里有两个问题,一是在这里使用surfaceview是不合适的,因为在一般情况下一个activity对应一个ViewRoot,从而对应同一个surface和canvas(这个的分析可以看看这两个帖子的描述:http://blog.csdn.net/luoshengyang/article/details/8303098 http://blog.csdn.net/luoshengyang/article/details/8170307 ),所以切换到其他fragment时如果此操作不停止,在其他view中将出现不和时机的canvas锁定和释放,在滑动中就出现canvas滑动位置的异常。二是View画得不合理。

流畅用刷新帧率来衡量,帧率是什么呢,其实就是单位时间内刷新视图显示的次数。动画是利用人眼的视觉暂留产生的错觉,也就是说帧率越大,间隔的时间越短,人眼越分辨不出来。
总的来说,帧率要高就必须减少每次刷新视图之间的处理时间短,比如Android4.1系统优化过之后基本能使得帧率到达60fps,也就是说每秒钟刷新60次,每次间隔的时间是16.6ms,也就是说包括准备显示内容到显示到整个屏幕上只能花费这么点时间。帧率的首先与CPU的处理速率,屏幕的大小以及显存位宽有密切关系,这不难理解吧,这是约束准备数据和数据传到屏幕时间的因素。其次,GUI软件架构也是重要的因素也是各个操作系统之间差异的体现。(ios上的动画反应比android上的流畅,一部分原因是ios在动画和手势操作时CPU和资源百分百为ui刷新而工作的,而android却同时分心在完成后台的其他工作,速度上的差异还是很明显的。)

对于同样机器环境上的应用来说,抛去受CPU、屏幕和系统GUI系统的固有时间消耗外,要实现流畅的动画的核心也就是减少视图Draw的时间。这里有几点经验可以跟大家分享一下:
1、    尽量不要在刷新时做耗时操作,必须准备数据,创建图片,图片变换等,数据和图片都应该在之间就加载到内存中,图片变换用canvas的变换来实现。
2、    同一个界面中多个动画重叠出现时,尽量将动画的刷新过程统一进行刷新,避免频繁的invalidate,尤其是多个动画有时序上的关系时更应该统一。
3、    尽量使用带有参数的invalidate来刷新,这样可以减少很多运算量。
4、    合理的环境下使用surfaceview来操作,比如播放视频等,这种刷新耗时比较大的情况。
5、    开启硬件加速,硬件加速由于采用了显示列表的概念,所以刷新过程也有很大的优化,但是会增加额外的8M内存占用。

以上只是我个人的一些观点,如果有不正确请大家不吝赐教共同探讨。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值