1:Android显示原理
Android应用程序的显示过程包含了两个部分(应用侧绘制、系统侧渲染)、两个机制(进程间通讯机制、显示刷新机制)
1.1:基本概念
SurfaceFlinger:Android系统服务,负责管理Android系统的帧缓冲区,即显示屏幕。
Surface:可以理解为Android应用程序的一个窗口。
1.2: 应用侧
渲染过程可以分为测量、布局和绘制三个阶段。
测量:各个子UI元素的大小onMeasure
布局:各个子UI元素在父UI元素里面的位置
绘制:在画布canvas上绘制应用程序窗口所有的视图,分为基于软件的绘制模型(CPU)和硬件加速的绘制模型(GPU)onDraw
1.3: 系统侧
Android应用程序在图形缓冲区中绘制好View层次结构后,这个图形缓冲区会被交给SurfaceFlinger服务,而SurfaceFlinger服务再使用OpenGL图形库API来将这个图形缓冲区渲染到硬件帧缓冲区中。
1.4: 进程间通讯机制
Android应用程序为了能够将自己的UI绘制在系统的帧缓冲区上,它们就必须要与SurfaceFlinger服务进行通信。
Android应用程序与SurfaceFlinger服务是运行在不同的进程中的,因此,它们采用某种进程间通信机制来进行通信。由于Android应用程序在通知SurfaceFlinger服务来绘制自己的UI的时候,需要将UI数据传递给SurfaceFlinger服务,例如,要绘制UI的区域、位置等信息。一个Android应用程序可能会有很多个窗口,而每一个窗口都有自己的UI数据,因此, 这里用到了SharedClient
在每个SharedClient中,最多有31个SharedBufferStack,每个SharedBufferStack都对应一个Surface,即一个窗口。这样,我们就可以知道为什么每一个SharedClient里面包含的是一系列SharedBufferStack而不是单个SharedBufferStack:一个SharedClient对应一个Android应用程序,而一个Android应用程序可能包含有多个窗口,即Surface。从这里也可以看出,一个Android应用程序至多可以包含31个窗口。
每个SharedBufferStack中又包含了N个缓冲区(<4.1N=2; >=4.1 N=3),即显示刷新机制中即将提到的双缓冲和三重缓冲技术。
1.5: 显示刷新机制
双缓冲意味着要使用两个缓冲区(SharedBufferStack中),其中一个称为FrontBuffer,另外一个称为BackBuffer。UI总是先在Back Buffer中绘制,然后再和FrontBuffer交换,渲染到显示设备中。理想情况下,这样一个刷新会在16ms内完成(60FPS)
第一帧被画了两次(Jank),CPU/GPU没有及时处理第2帧数据?原因很简单,CPU可能是在忙别的事情,不知道该到处理UI绘制的时间了,所以又用到了中断机制:
每收到VSYNC中断,CPU就开始处理各帧数据,这样就可以顺滑的运行了。
一句话总结:Android应用程序调用SurfaceFlinger服务把经过测量、布局和绘制后的Surface渲染到显示屏幕上。