Android图形显示系统从软件层面到硬件层面主要分为三个部分。
1、应用层
2、系统层
3、硬件层
这三部分就像工厂的流水线作业一样,完成了界面内容的展现。
上图便是我对Android图形显示系统的理解。
应用层
对于一个应用程序来说,在一个Activity之上可能会有多个Window,比如status bar是一个Window,Activity主界面是一个Window,底部虚拟按键栏是一个Window,另外,如果有Dialog的话,还是一个Window。
每个Window对应一个Surface,而每一个Surface中都有31个Buffer。
CPU首先在一帧内对这些Window中的View进行测量、布局、生成多边形和纹理。然后再将它们交给GPU,GPU对生成的纹理和多边形进行栅格化处理。最后,GPU再将处理完的内容写入各个Window的Surface的一个Buffer中,放入Buffer队列。
这些Surface的Buffer队列用的共享内存,应用层就是通过这些共享内存来与系统层进行交互的。
CPU和GPU分别是在各自的缓冲区中处理数据的,来保证一定层度的并行处理。CPU在收到Vsync信号后,开始执行下一帧。
系统层
系统层主要使用SurfaceFlinger系统服务,从各个Buffer队列中取出Buffer,并将这些Buffer中的内容进行合成。
SurfaceFlinger合成完一帧的数据后,需要将其交给显示屏显示出来。
Android设备的显示屏被抽象为一个帧缓冲区,而Android系统中的SurfaceFlinger服务就是通过向这个帧缓冲区写入内容来绘制应用程序的用户界面的。
SurfaceFlinger服务在启动的过程中,会对系统的硬件帧缓冲区进行初始化。由于系统的硬件帧缓冲区一般只有两个,并且不是谁都可以随便访问的,因此,它就需要由一个服务来统一管理。在Android系统中,这个服务便是SurfaceFlinger。
硬件层
上文提到的硬件抽象层的两个帧缓冲区分别是前帧缓冲区和后帧缓冲区。之所以有两个帧缓冲区,是因为屏幕绘制一帧图像需要一个缓冲区,而SurfaceFlinger合成完数据后需要将其提交到另一个缓冲区中,等Vsync信号来临时,再调换两个帧缓冲区,让屏幕绘制第二个缓存区的内容。如果SurfaceFlinger合成完的数据和屏幕正在绘制的数据在同一个缓冲区的话,会出现前后两帧图像重叠的情况。
看到网上一篇文章对Android显示系统的解释非常好,大家也可以看看:
https://blog.csdn.net/a740169405/article/details/70548443