Android图形系统是系统框架中一个非常重要的子系统,与其它子系统一样,Android 框架提供了各种用于 2D 和 3D 图形渲染的 API供开发者使用来创建绚丽多彩的应用APP。图形渲染的 API的底层可与制造商的图形驱动程序实现代码交互,了解这些API的工作原理及图形系统框架层的处理逻辑可以帮助我们更好的使用这些功能。
本系列文章将侧重于图形系统BufferQueue的知识做分析讲解。BufferQueues 是 Android 图形组件之间的粘合剂,BufferQueue 类将生成图形数据缓冲区的组件(producers)连接到接受数据以便进行显示或进一步处理的组件(consumers)。几乎所有在系统中移动图形数据缓冲区的内容都依赖于 BufferQueue。理解BufferQueue的工作逻辑及图形缓冲区移动流程对于我们学习Android图形系统工作机制非常重要。
本篇作为该系列的开篇,我们将从Android图形系统的一些基本概念入手。
接下来就开始我们的学习之旅。
注:本系列文章的分析及代码均基于Android 12(S) Source Code,可参考:http://aospxref.com/ 或 http://aosp.opersys.com/
Android图形系统涉及到非常多的组件,比如 Surface、SurfaceHolder、EGLSurface、SurfaceView、GLSurfaceView、SurfaceTexture、TextureView、SurfaceFlinger等,比如下图展示的:
低级别组件
高级别组件
Android图形组件相互配合、沟通,共同组成一个完善的图形显示子系统,同时在Java level与Native level面向开发者提供了可编程的接口。
无论开发者使用什么渲染 API,一切内容都会渲染到 Surface 上。Surface 表示缓冲区队列中的生产者,而缓冲区队列通常会被 SurfaceFlinger 消耗。在 Android 平台上创建的每个窗口都由 Surface 提供支持。所有被渲染的可见 Surface 都被 SurfaceFlinger 合成到屏幕。
下图显示了关键组件如何协同工作:
从工作流程的角度去看,主要组件如下所述:
图像流生产者可以是生成图形缓冲区以供消耗的任何内容。例如 OpenGL ES、Canvas 2D 和 mediaserver 视频解码器。
图像流的最常见消费者是 SurfaceFlinger,该系统服务会消耗当前可见的 Surface,并使用窗口管理器中提供的信息将它们合成到屏幕。SurfaceFlinger 是可以修改所显示部分内容的唯一服务。SurfaceFlinger 使用 OpenGL 和 Hardware Composer 来合成一组 Surface。
其他 OpenGL ES 应用也可以消耗图像流,例如相机应用会消耗相机预览图像流。非 GL 应用也可以是使用方,例如 ImageReader 类。
显示子系统的硬件抽象实现。SurfaceFlinger 可以将某些合成工作委托给硬件混合渲染器(HWC),以分担 OpenGL 和 GPU 上的工作量。SurfaceFlinger 只是充当另一个 OpenGL ES 客户端。因此,在 SurfaceFlinger 将一个或两个缓冲区合成到第三个缓冲区中的过程中,它会使用 OpenGL ES。这会让合成的功耗比通过 GPU 执行所有计算时更低。
硬件混合渲染器 HAL 则进行另一半的工作,是所有 Android 图形渲染的中心点。Hardware Composer 必须支持事件,其中之一是 VSYNC(另一个是支持即插即用 HDMI 的热插拔)。
Gralloc可以理解为图形内存分配器,用来分配和管理图像生产者请求的内存(即图形数据缓冲区Graphic Buffers)
有关 Android graphics pipeline的描述,请参见下图:
BufferQueues 是 Android 图形组件之间的粘合剂。它们是一对图像缓冲区队列,可以调解缓冲区从生产者到消费者的固定周期。一旦生产者移交其缓冲区,SurfaceFlinger 便会负责将所有内容合成到显示部分。
有关 BufferQueue 通信过程,请参见下图。
BufferQueue 包含将图像流生产者与图像流消费者结合在一起的逻辑。BufferQueue 类是 Android 中所有图形处理操作的核心。它的作用很简单:将生成图形数据缓冲区的一方(生产方)连接到接受数据以进行显示或进一步处理的一方(消耗方)。几乎所有在系统中移动图形数据缓冲区的内容都依赖于 BufferQueue。
通过上图我们可以大概看到BufferQueue的工作过程:
通过上面的一些介绍,我们对Android图形系统的一些基本组成及概念有了一个大概的了解。为了更深刻的理解这些抽象的内容,下一篇文章我们将从Native Level入手,基于Android图形系统API写作一个简单的图形处理小程序。
保持一份好心情
参考
https://www.jianshu.com/p/824a9ddf68b9
https://www.cnblogs.com/1996swg/p/9790209.html
手机扫一扫
移动阅读更方便
你可能感兴趣的文章