Android - UI卡顿的处理

215 阅读1分钟

Android 系统每隔 16ms 发出 VSYNC 信号 (1000ms/60=16.66ms) ,触发对 UI 进行渲染, 如果每次渲染都成功这样就能够达到流畅的画面所需要的 60fps ,为了能够实现 60fps ,这意味着计算渲染的大多数操作都必须在 16ms 内完成。

卡顿原理分析

当一帧画面渲染时间超过16ms的时候,垂直同步机制会让显示器硬件等待GPU完成栅格化渲染操作,这样会让这一帧画面停留的时间超过16ms,甚至更多,这样就造成了用户看起来画面停顿的问题。

16ms的时间主要被两件事件所占用
  • 第一件:将UI对象转换为一系列多边形和纹理
  • 第二件:CPU传递处理数据到GPU 所以我们要缩短这两部分的时间,也就是要尽量减少对象转换的次数,以及上传数据的次数。
减少这两部分的方式:
  1. CPU减少xml转换成对象的时间
  2. GPU减少重复绘制的时间
GPU过度绘制的几种情况
  1. 自定义控件中onDraw方法做了多个重复绘制
  2. 布局层次太深,重叠性太强。用户看不到的区域GPU也会渲染,导致耗时增加
布局优化原则
  1. 减少不必要嵌套
  2. 使用merger避免与父容器重叠
  3. 能复用的代码,用include处理,可以减少GPU重复工作