用户对卡顿的感知, 主要来源于界面的刷新. 而界面的性能主要是依赖于设备的UI渲染性能. 如果我们的UI设计过于复杂, 或是实现不够友好,计算绘制算法不够优化, 设备又不给力, 界面就会像卡住了一样, 给用户卡顿的感觉.
如果你的应用界面出现卡顿不流畅的情况,不用怀疑,这很大原因是你没有在16ms完成你的工作。没错,16ms要完成你的工作,再慢点,用户就会感觉到卡顿,也许就会在屏幕对面开始吐槽你的APP,然后狠心把你辛辛苦苦开发出来的APP给卸载掉,打住,跑偏了!
1、16ms原则
Android 在不同的版本都会优化“UI的流畅性”问题,但是直到在android 4.1版本中做了有效的优化,这就是Project Butter。
Project Butter 加入了三个核心元素: VSYNC、Triple Buffer 和 Choreographer。其中,VSYNC 是理解Project Buffer的核心。
VSYNC:产生一个中断信号
Triple Buffer:当双 Buffer 不够使用时,该系统可分配第三块 Buffer
Choreographer:这个用来接受一个 VSYNC 信号来统一协调UI更新
接下来我们就逐个去解析这3个核心元素:
在了解VSYNC之前,我们首先来了解一下我们在 xml 写的一个布局是如何加载到Acitivty/Fragment中并最终 display 呢?,我相信这个过程大部分程序猿也并不是很关心,因为 Android 底层都为为我们搞定这一部分的处理。但是如果要了解16ms原则,我们简单了解下这个过程是非常有必要的。先看我简单画的一个图:
从上面的图可以看出,CPU 会先把 Layout 中的 UI 组件计算成 polygons(多边形)和 textures(纹理),然后经过 OpenGL ES 处理(这个处理过程非常复杂,感兴趣的童鞋可以继续耕耘)。OpenGL ES处理完后再交给 GPU 进行栅格化渲染,渲染后 GPU 再将数据传送给屏幕,由屏幕进行绘制显示。
Activ