任何一个带UI的APP都是一个image stream producer,应用可以包含两个部分,UI和视频内容。
UI部分就是在APP进程通过Skia绘制的所有可见控件的集合,Skia绘制引擎有CPU和GPU两个backend,GPU的backend主要是通过OpenGLES和Vulkan框架驱动来使用GPU的,针对不同的内容使用不同的backend可以实现高效率的绘制。UI是一个树结构,绘制过程是从UI的最底开始绘制,一层一层绘制上去,绘制的内容通过Surface来提交到SurfaceFlinger,在Android的定义中SurfaceFlinger是唯一能够改变视频内容的服务。
视频部分就是上图中Image Stream Producers提到的视频,MediaPlayer通过MediaCodec解码得到的视频流,Camera Preview通过Camera HAL读取到的视频,OpenGLES通过绘制得到的视频流,这些视频流同样通过Surface提交到SurfaceFlinger,那么这些视频流是不是只能流向SurfaceFlinger呢,其实也不是,OpenGLES APP同样也可以接受处理这些视频流,比如常见的美颜相机,就是将Camera的视频流通过Surface提交给OpenGLES,在GPU中处理好效果后输出到另外一块Surface中最终提交到SurfaceFlinger,此外,OpenGLES输出的Surface也可以用作编码模块MediaCodec的输入,主要用于录像和直播推流场景。
Surface本质上是一个图像缓存队列,用于连接不同的图像使用模块,前端模块为生产者,后端模块为消费者,那么不同的模块产生的图像格式不同,分辨率大小不同,内存类型要求(是否需要物理连续),这时需要一个内存分配模块来管理,这个模块就是Gralloc,它根据不同的生产者producer,不同的消费者consumer,不同的用途usage来选择不同的格式的图像,比如CPU需要访问,那么就不能分配类似AFBC格式这样的硬件才能识别的格式,同时Gralloc也要考虑不同IP需要使用物理连续内存,没有特殊要求,一般分配的内存都是虚拟连续,物理非连续,这样的内存申请容易成功,但是由于物理非连续,访问效率通常不高,对于一些内存访问效率要求高的IP就不能使用,如DPU。
Hardware Composer用加速图层合成,用于减轻GPU的工作,从功能上来说,GPU可以完成所有的图层绘制和图层合成工作,所以hardware Composer也可以完全由GPU来实现,但是GPU的loading会比较高,所以引入单独的硬件单元来做图层合成从而降低GPU loading,从而让APP可以最大化使用GPU的性能来绘制更好看的UI或者游戏界面,一般情况下DPU承担了这个Hardware composer的工作。