目录
引言
Android图形的关键组件:
Android图形的pipeline数据流
BufferQueue是啥?
引言
Android提供用于2D和3D图形渲染的API,可与制造商的驱动程序实现代码交互,下面梳理一下Android图形的运作原理。
应用开发者通过三种方式将图像绘制到屏幕上:Canvas,OpenGLES Vulkan
Android图形的关键组件:
1)图像流生产:图像流生产方可以生成图形缓冲区以供消耗。相机预览,播放器播放视频,OpenGL ES画图
2)图像流消耗:图像流的消耗方是Surfaceflinger,该系统服务会消耗当前可见的 Surface,并使用窗口管理器中提供的信息将它们合成到屏幕。
另外我们需要知道:
SurfaceFlinger 是可以修改所显示部分内容的唯一服务。
SurfaceFlinger 使用 OpenGL 和 Hardware Composer 来合成一组 Surface。
3)HWC:显示子系统的硬件抽象实现。
HWC可以将某些合成工作委托给硬件混合渲染器,以分担 OpenGL 和 GPU 上的工作量。
SurfaceFlinger 只是充当另一个 OpenGL ES 客户端。因此,在 SurfaceFlinger 将一个或两个缓冲区合成到第三个缓冲区中的过程中,它会使用 OpenGL ES。这会让合成的功耗比通过 GPU 执行所有计算时更低。硬件混合渲染器 HAL 则进行另一半的工作,是所有 Android 图形渲染的中心点。
Hardware Composer 必须支持事件,其中之一是 VSYNC(另一个是支持即插即用 HDMI 的热插拔)。
4)Gralloc:图形缓存分配器,分配图像生产方请求的内存。
图1.Surface如何被渲染
从图1,可以看到几个关键组件的基本关系情况:
1)图像流生产方会持有native框架的Surface
2)图像流生产方的窗口信息会由WindowManager管理
3)图像流消费方从WindowManager获取渲染信息进行渲染通过HAL提供给HWC进行合成
Android图形的pipeline数据流
下面看看Android图形的pipeline数据流:
图2.Android图形的数据流
左侧是生成图形缓冲区的渲染器,右侧是合成器,HWC是混合渲染器。
结合图形的组件架构有4个理解:
第一,图形生产方生产的缓冲区包括:
1)状态栏:STATUS BAR
2)系统栏:SYSTEM BAR
3)背景渲染器:BACKGROUND RENDERER
4)图标/控件渲染器:ICONS/WIDGETS RENDERER
第二,从图2看出是通过GPU进行渲染,并且通过BufferQueue进行生产方和消费方的流转管理。
第三,有些图层是可以直接提交给HWC进行合成的,有些是通过SurfaceFlinger进行合成,然后再提交到HWC进行最终合成的;其中Surfaceflinger合成使用的是OpenGLES来进行渲染合成的。
第四,生产方,消费方组件之间都是通过BufferQueue粘合起来的
BufferQueue是啥?
1)BufferQueue是Android图形组件之间的粘合剂
2)他们是一对队列,可以循环调解缓冲区从生产方到消耗方
BufferQueue 可以在三种不同的模式下运行:
Synchronous-like mode:同步模式,如果生产速度快于消费速度,那么生产就会停下来等待消费完再进行生产(等待可用的缓冲区)。这种方式不会丢弃任何缓冲区。
Non-blocking mode:非阻塞模式,可以理解为异步模式。这个方式下会生成错误,而不是等待缓冲区,有助于避免出现死锁现象。这种方式页不会丢弃任何缓冲区。
Discard mode:舍弃模式。BufferQueue 可以配置为丢弃旧缓冲区,而不是生成错误或进行等待。例如,如果对纹理视图执行 GL 渲染并尽快绘制,则必须丢弃缓冲区。