一、概要
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就开始解决各帧数据。
关注我,每天分享常识干货,你要的,我都有~~~