Android性能优化-布局优化(一)

说明

大多数用户感知的卡顿等性能问题的最主要的根源都是渲染性能。Android系统每隔16ms发出VSYNC信号(vertical synchronization-场扫描同步),触发对UI进行渲染,如果每次都渲染成功,这样就能达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的绝大部份操作都必须在16ms内完成.如果你的某个操作花费是24ms,系统在得到VSYNC信号的时候无法进行正常渲染,这样就会产生丢帧现象,那么用户在32ms看到的就是同一帧画面。

指标

  • 滑动流畅度:FPS,即Frame per Second,一秒内的刷新帧数,越接近60越好。

  • 过渡绘制: 单页面的3X(粉红色区域) OverDraw小于25%。

  • 启动时间: 这里主要说的是Activity页面启动时间,一般低于300ms,需要用高频摄像机计算时间。

检测工具

Layout Inspector/HierarchyViewer

主要原因

  • 人为在UI线程做轻微耗时操作,导致UI线程卡顿

  • 布局Layout过于复杂,无法在16ms内完成渲染

  • 同一时间动画执行的次数过多,导致CPU或GPU负载过重

  • View过度绘制,导致某些像素在同一帧时间内被绘制多次,从而使CPU/GPU负责过重

  • View频繁的触发measure,layout,导致measure,layout累计耗时过多及整个View频繁的重新渲染

  • 内存频繁触发GC过多(同一帧中频繁创建内存),导致暂时阻塞渲染操作.

  • 冗余资源及逻辑等导致加载和执行缓慢

  • 臭名昭著的ANR

其中最主要的两个原因是过渡绘制和布局冗余。

过渡绘制

OverDraw描述的是屏幕的某个像素在同一帧的时间内被绘制多次,在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制多次,这就浪费了大量的CPU以及GPU资源,找到界面滑动不顺畅,界面启动速度慢,手机发热。

查看方式:

手机系统设置->开发者选项->调试GPU过度绘制

img

说明:

  • 原色 没有过度绘制
  • 紫色 1次过度绘制
  • 绿色 2次过度绘制
  • 粉色 3次过度绘制
  • 红色 4次以上过度绘制

解决方案:

  • 去除布局中多余的背景,除了布局中多余的背景,还有可能是代码中添加了多余的背景。

  • 自定义View,通过Canvas的clipRect方法控制每个视图每次刷新的区域,这样可以避免刷新不必要的区域,从而规避过度绘制的问题.还可以通过canvas.quickRejct()来判断是否和某个矩形相交,从而跳过那些非矩形区域的绘制操作。

布局冗余

布局太过复杂,层级嵌套太深导致绘制操作耗时,且增加内存的消耗,我们的目标是层级扁平化。

使用Layout Inspector,查看结果

img

建议:

  • 在不影响层级深度的情况下,使用LinearLayout和FrameLayout而不是RelativeLayout

  • 合理使用include/megre/ViewStub标签

  • 避免创建不必要的布局层级

  • 使用约束布局ConstraintLayout

你可能感兴趣的:(Android性能优化-布局优化(一))