背景
在我们使用app过程中难免会遇到页面卡顿的时候,UI卡顿会让用户体验极差。要想找到造成UI卡顿的原因,我们就要了解CPU与GPU的工作流程
CPU与GPU工作流程
CPU主要负责计算,GPU主要负责渲染
image.png
在我们日常开发中一个button是怎么显示到屏幕上的呢?
1.首先通过LayoutInflater生成一个Button对象,保存到内存中包括位置信息等,交给CPU处理
2.CPU经过计算,处理成多维的向量图形,交给GPU
3.GPU将适量图形栅格化,进行像素填充,完成绘制
image.png
60HZ刷新频率由来
在与手机交互过程中,如触摸和反馈 60 帧以下人是能感觉出来的。 60 帧以上不能察觉
变化
卡顿的原理
Android 系统每隔 16ms 发出 VSYNC 信号 (1000ms/60=16.66ms) ,触发对 UI 进行渲染, 如果每次渲染都成
功这样就能够达到流畅的画面所需要的 60fps ,为了能够实现 60fps ,这意味着计算渲染的大多数操作都必须
在 16ms 内完成。如果16ms内没有完成就会在造成卡顿。
卡顿造成的原因
1.过度绘制
2.布局复杂
解决办法
3.1过度绘制优化(主要减少GPU工作量)
一.查找过度绘制方法
手机开发者选项-》Profile GPU rendering/调试GPU过度绘制
image.png
二.处理方案
1.减少背景重复
注意主题中的设置
(1) 去掉单个activity的主题设置的属性
可以在setContentView之前getWindow().setBackgroundDrawable(null);
(2) 去掉所有activity主题设置中的属性
直接在styles.xml中设置<item name="android:windowBackground">@null</item>
非业务需要,不要去设置背景
2.使用裁减减少控件之间的重合部分(自定义控件,例如纸牌游戏覆盖部分)
3.2布局优化(主要减少CPU工作量)
常用工具
1.Android/sdk/tools/bin/ui automator viewer.bat
2.Android\sdk\tools\monitor.bat
3.Device Monitor窗口中Hierarchy view
三个点也是代表着View的Measure, Layout和Draw。
绿: 表示该View的此项性能比该View Tree中超过50%的View都要快;例如,代表Measure的是绿点,意味着这个视图的测量时间快于树中的视图对象的50%。
黄: 表示该View的此项性能比该View Tree中超过50%的View都要慢;
红: 表示该View的此项性能是View Tree中最慢的;。
处理方案
1.能在一个平面显示的内容,尽量只用一个容器
2.尽可能把相同的容器合并merge
3.能复用的代码,用include处理,可以减少GPU重复工作