Android图形-架构1

目录

引言

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:图形缓存分配器,分配图像生产方请求的内存。

Android图形-架构1_第1张图片

       图1.Surface如何被渲染

从图1,可以看到几个关键组件的基本关系情况:

1)图像流生产方会持有native框架的Surface

2)图像流生产方的窗口信息会由WindowManager管理

3)图像流消费方从WindowManager获取渲染信息进行渲染通过HAL提供给HWC进行合成

Android图形的pipeline数据流

下面看看Android图形的pipeline数据流:

Android图形-架构1_第2张图片

图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 渲染并尽快绘制,则必须丢弃缓冲区。

你可能感兴趣的:(Android系统开发,android)