作为Android应用的开发,要想确保用户拥有比较顺滑的体验,就一定要从原理上深入理解Android UI的渲染流程。只有真正理解了UI的渲染流程,才能在Android应用的开发过程中尽量避免影响UI性能的设计和实现,并且能够在UI性能的优化上有的放矢。
背景
KitKat引入了Project Butter用于提升图形系统的流畅度。Project Butter对Android图形显示系统进行了重构,引入了Vsync(垂直同步)、Triple Buffer(三重缓存)和Choreographer。
问题
在一个典型的显示系统中,一般包括CPU、GPU和显示控制器这3个部分。CPU用于数据计算,计算结果交给GPU进行渲染,渲染之后的数据被放到buffer中缓存起来,最后由显示控制器将buffer中的数据显示到屏幕上。这个过程存在两个问题。
图形撕裂
在图形绘制速度大于显示速度的情况下,CPU/GPU将当前帧的数据写入buffer后,显示控制器还来不及显示它,CPU/GPU就开始把下一帧的数据写入到buffer中了。当显示控制器开始读取buffer并显示到屏幕上的时候,就会出现屏幕的上半部分是下一帧的情况,这就是所谓的图形撕裂。
卡顿
图形的绘制速度过慢的时候,同一帧会在屏幕上至少显示2次。
在第一个16ms内,屏幕显示的是第0帧,CPU/GPU开始处理第1帧。进入第二个16ms,因为在上一个16ms的时间内,第1帧已经由CPU/GPU处理完毕。因此屏幕可以正常显示第1帧。然而,在第二个16ms的时间内,CPU/GPU并未能及时完成第2帧的绘制工作。因此,进入第三个16ms后,屏幕显示的依旧是第1帧的数据,从而产生了一个卡顿。
解决方案
为了解决上述两个问题,Project Butter对Android图形显示系统进行了重构,引入了Vsync(垂直同步)、Triple Buffer(三重缓存)和Choreographer。
Vsync
为解决卡顿的问题,Project Buffer引入了Vsync。显示系统在收到VSync信号之后