布局优化也是Android优化的一个重要组成部分。好的UI界面不仅应该为用户带来良好的视觉效果,同时也应该具有流畅的操作体验。而Android系统在渲染UI时将会消耗大量的系统资源。所以,布局优化就显得尤为重要啦。
Android UI渲染机制
Android应用程序显示的过程:
一句话概括:Android应用程序调用SurfaceFlinger服务,把经过测量,布局,绘制后的Surface渲染到显示屏幕上。
(名词解释:)
SurfaceFlinger:SurfaceFlinger是Android的一个系统服务,负责管理Android系统的帧缓冲区,即显示屏幕。
Surface:Surface代表的是Android应用程序的每个窗口,每一个Surface对应一个画布,它就代表着Android应用程序的一个窗口。
更多详细信息可以参考以下链接:
神奇的16ms
** 16ms 其实指的是 1000ms/ 60Hz, 相当于60fps,为什么是16ms,这是由于人的生物构造决定的。由于运动模糊的效果,24fps就会让我们感觉到连续线性的运动,同时也是电影胶圈通常使用的帧率。60fps是最合适的帧率,这样就不会卡顿**
渲染是通过CPU和GPU共同完成的,CPU(测量-->布局-->记录-->执行)-------->GPU。
渲染性能(Render Performance)
大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成。
卡顿的原因:
- layout太过复杂,无法在16ms内完成渲染;
- UI层次结构太多;
- 动画执行次数过多;
这些都会导致CPU 或者GPU负载过重。
我们可以通过一些工具来定位问题:
- 使用Hierarchy Viewer来查找Activity中的布局是否过于复杂;
- 使用手机设置中的开发者选项,打开Show GPU OverDraw(调试GPU过度重绘);
- 使用手机设置中的开发者选项,打开 Profile GPU Rendering(GPU呈现模式分析),然后选中 On Screen as Bars的选项,这时候在屏幕上将显示一些条形图;
1.检测UI渲染时间
开启GPU呈现模式分析Android系统已经为我们提供了该工具,即:使用手机设置中的开发者选项,打开 Profile GPU Rendering(GPU呈现模式分析),然后选中 On Screen as Bars的选项。
从图中我们可以发现有四个部分组成:
- 绿色的水平线:VSYNC 时间为 16ms,需要尽量将所有条形图都控制在该线以下;
- 蓝色的线:代表测量绘制Display List的时间;
- 红色的线:代表OpenGL渲染Display List所需要的时间;
- 黄色的线:代表CPU等待GPU处理的时间;
从该图可以清晰地看出,这些区域其实是每一根条形柱线组成,而每一条柱线都有上面提到的(蓝,红,黄线组成)。
随着界面的刷新,界面上的柱状图会滚动,表示每帧图画所需要的渲染时间,柱状图越高表示花费的渲染时间越长。
2.避免重绘(Overdraw)
Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费了大量的CPU以及GPU资源。
系统为我们提供了Overdraw的检测工具。打开开发者选项:“Enable GPU Overdraw(调试GPU过度绘制)”
蓝色,淡绿,淡红,深红代表了4种不同的OverDraw情况,我们的目标是尽量减少红色的OverDraw,增加蓝色占比。(PS:面试时有人问过我这四类颜色)
4.通过使用Hierarchy Viewer工具查看布局
尽量使得布局扁平化,移除非必需的UI组件,这些操作可以有效减少Measure,Layout的计算时间。
网友评论