一、概要
Android应用程序显示的过程:Android应用程序调用SurfaceFlinger服务把经过测量、布局和绘制后的Surface渲染到显示屏幕上。
SurfaceFlinger:android系统服务,负责管理android系统的帧缓冲区,即显示屏幕。
Surface:android应用的每个窗口对应一个画布(Canvas),即Surface,可以理解为android应用程序的一个窗口。
Android应用程序的显示过程包含了两个部分(应用侧绘制、系统侧渲染)、两个机制(进程间通讯机制、显示刷新机制)。
二、应用侧绘制
一个android应用程序窗口里面包含了很多UI元素,这些元素是以树形结构来组织的,即它们存在着父子关系,其中,子UI元素位于父UI元素里面。
因此,在绘制一个android应用程序窗口的UI之前,首先要确定里面的各个子UI元素在父UI元素里面的大小和位置。确定各个子UI元素在父UI元素里面的大小以及位置的过程有称为测量过程和布局过程。因此,android应用程序窗口的UI渲染过程可以分为测量、布局和绘制三个阶段。
测量:递归(深度优先)确定所有视图的大小(宽、高)
布局:递归(深度优先)确定所有视图的位置(左上角坐标)
绘制:在画布canvas绘制应用程序窗口的所有视图
三、系统侧渲染
android应用程序在图形缓冲区中绘制好View层次结构后,这个图形缓冲区会被交给SurfaceFlinger服务,而SurfaceFlinger服务再使用OpenGL图形库API来将这个图形缓冲区渲染到硬件帧缓冲区中。
android图像显示的底层原理:
CPU:作用是计算图片的形状和文字的纹体
GPU:功能是渲染图像的颜色
Display:屏幕显示图像
Vsync:垂直同步信号,显卡输出频率与屏幕刷新频率同步的信号
android图像在绘制的时候,首先是CPU计算出图像形状,计算完成CPU会将图像交给GPU渲染出颜色,如果这一切都能够在16ms内完成,那么在下一个VSync出现时,就能显示刚刚渲染出来的那一帧图像了。但是如果CPU和GPU处理一帧图像时间超过16ms,那么这帧图像只能等到第二个VSync出现时才能刷出屏幕,呈现给用户了,这就意味着用户在32ms内所看到的是同一帧图像,这就是所谓的掉帧,也就是卡顿了。
四、进程间通讯机制
android应用程序为了能够将自己的UI绘制在系统的帧缓冲区上,它们就必须要与Surface服务进行通信。
android应用程序与SurfaceFlinger服务是运行在不同的进程中的,因此,它们采用某种进程间通信机制来进行通信。由于android应用程序在通知SurfaceFlinger服务来绘制自己的UI的时候,需要将UI数据传递给SurfaceFlinger服务,例如,要绘制UI的区域、位置等信息。一个android应用程序可能会有很多个窗口,而每一个窗口都有自己的UI数据,因此,android系统的匿名共享内存机制就派上用场了。
每一个android应用程序与SurfaceFlinger服务之间,都会通过一块匿名共享内存来传递UI数据。但是单纯的匿名共享内存在传递多个窗口数据时缺乏有效的管理,所以匿名共享内存就被抽象为一个更上流的数据结构SharedClient。
在每个SharedClient中,最多有31个SharedBufferStack,每个SharedBufferStack都对应一个Surface,即一个窗口。一个SharedClient对应一个android应用程序,而一个android应用程序可能包含多个窗口,但至多可以包含31个窗口。每个SharedBufferStack中又包含了N个缓冲区(android4.1以下,N = 2,4.1以上,N = 3),即显示刷新机制中即将提到的双缓冲和三缓冲技术。
五、显示刷新机制
一般我们在绘制UI的时候,都会采用一种称为“双缓冲”的技术。双缓冲意味着要使用两个缓冲区,其中一个被称为Front Buffer,另外一个被称为Back Buffer。UI总是先在Back Buffer中绘制,然后再和Front Buffer交换,渲染到显示设备中。在android4.1中引入了VSync,这类似于时钟中断,每收到VSync中断,CPU就开始处理各帧数据。
关注我,每天分享知识干货,你要的,我都有~~~