第一步:要明白的几个名词
16ms是什么意思
大多数的Android显示屏幕是以每秒60帧来刷新的(也就是60Hz)。一帧可以看做是一张的独立图片,60帧每秒就意味着:16ms=1000/60Hz,相当于60fps。这就是上面说的16ms
为什么有60fps这个概念?
这是因为人眼与大脑之间的协作无法感知超过60fps的画面更新。12fps大概类似手动快速翻动书籍的帧率,这明显是可以感知到不够顺滑的。24fps使得人眼感知的是连续线性的运动,这其实是归功于运动模糊的 效果。24fps是电影胶圈通常使用的帧率,因为这个帧率已经足够支撑大部分电影画面需要表达的内容,同时能够最大的减少费用支出。但是低于30fps是 无法顺畅表现绚丽的画面内容的,此时就需要用到60fps来达到想要的效果,当然超过60fps是没有必要的(据说Dart能够带来120fps的体验)
栅格化
栅格化简单来说就是将向量图转化为机器可以识别的位图的一个过程。其中很复杂也比较很耗时,GPU就是用来加快栅格化的速度
第二步:记录几个 优化方法
1.尽可能减少Overdraw,就是减少过渡绘制,减少布局嵌套的层次,去掉重复设置的背景;
蓝色、淡绿、淡红,深红代表了4种不同程度的Overdraw的情况,我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。
减少层级方法:
1.1、善用相对布局Relativelayout
1、本身来说用Relative Layout会比最外层用其他例如LinearLayout要少一层
2、LinearLyoaut太过单一,复杂一点的就得嵌套来实现,用Relative Layout则不用
例如:
1.2、viewstub标签
平时开发会遇到动态控制某个view是否显示,一般做法是直接再Xml里设置gone,优点:逻辑处理简单,比较灵活 ;缺点:虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源
推荐的做法是使用Android.view.ViewStub
ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。这样,就可以使用ViewStub来方便的在运行时,要还是不要显示某个布局。
但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。
点击详见
1.3、merge标签
merge标签是作为include标签的一种辅助扩展来使用,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。
子布局外层用的layout,被include过来的外层也有个layout,这样就造成了多余的布局嵌套
2.减少listview中getView中的耗时操作,一些自定义的view尽可能减少invalidate的调用;
3.尽可能不要在UI线程做过多耗时的操作;
参考:
http://www.cnblogs.com/hoolay/p/6248514.html
http://www.jianshu.com/p/02800806356c