共计 1806 个字符,预计需要花费 5 分钟才能阅读完成。
一、概要
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 就开始解决各帧数据。
关注我,每天分享常识干货,你要的,我都有~~~