60Hz 刷新频率由来
12 fps :由于人类眼睛的特殊生理结构,如果所看画面之帧率高于每秒约 10-12 帧的时候,就会
认为是连贯的
24 fps :有声电影的拍摄及播放帧率均为每秒 24 帧,对一般人而言已算可接受
30 fps :早期的高动态电子游戏,帧率少于每秒 30 帧的话就会显得不连贯,这是因为没有动态模
糊使流畅度降低
60 fps 在与手机交互过程中,如触摸和反馈 60 帧以下人是能感觉出来的。 60 帧以上不能察觉
变化
当帧率低于 60 fps 时感觉的画面的卡顿和迟滞现象
Android 系统每隔 16ms 发出 VSYNC 信号 (1000ms/60=16.66ms) ,触发对 UI 进行渲染, 如果每次渲染都成
功这样就能够达到流畅的画面所需要的 60fps ,为了能够实现 60fps ,这意味着计算渲染的大多数操作都必须
在 16ms 内完成。
卡顿原理分析
当这一帧画面渲染时间超过16ms的时候,垂直同步机制会让显示器硬件等待GPU完成栅格化渲染操作,这样会让这一帧画面,多停留了16ms,甚至更多,这样就造成了用户看起来画面停顿。
16毫秒的时间主要被两件事情所占用
第一件:将UI对象转换为一系列多边形和纹理(1)(?)
第二件:CPU传递处理数据到GPU。所以很明显,我们要缩短
这两部分的时间,也就是说需要尽量减少对象转换的次数,以及上
传数据的次数(?布局自定义)
如何减少这两部分的时间以至于在16ms完成呢
CPU减少xml转换成对象的时间
GPU减少重复绘制的时间
什么是过度绘制
GPU的绘制过程,就跟刷墙一样,一层层的进行,16ms刷一次.这样就会造成图层覆盖的现象,即无用的图层还被绘制在底层,造成不必要的浪费。
GPU过度绘制几种情况
1,自定义控件中,ondraw方法做了过多重复绘制
2,布局层次太深,重叠性太强。用户看不到的区域GPU也会渲染,导致耗时增加
过度绘制优化方法:
1,减少背景重复
注意主题中的设置,去掉所有activity主题设置中的属性
直接在styles.xml中设置<item name="android:windowBackground">@null</item>
非业务需要,不要去设置背景
2,使用裁剪减少控件之间的重合部分
布局的优化(主要减少cpu工作量)
常用工具
1,Android/sdk/tools/bin/uiautomatorviewer.bat
2,Android\sdk\tools\monitor.bat
3,Device Monitor窗口中Hierarchy view
注意点:
1.能在一个平面显示的内容,尽量只用一个容器
2.尽可能把相同的容器合并merge
3.能复用的代码,用include处理,可以减少GPU重复工作