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

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

  • 相关阅读:
    云原生技术--- 容器知识点
    /dev下没有video0这个文件(ubuntu无法打开摄像头)
    关于log4j安全漏洞以及版本替换的记录
    常见文件编码 - 多字节编码与Unicode编码区别
    雪花算法(snowflake)
    测开岗学习资料
    .NET 缓存:内存缓存 IMemoryCache、分布式缓存 IDistributedCache(Redis)
    Linux权限的概念和权限管理
    Maven Wrapper 之 SpringBoot 项目下的 mvnw.cmd
    WPF不弹出控件的情况下,将控件内容生成截图
  • 原文地址:https://blog.csdn.net/haigand/article/details/132679889