Android Graphics Concepts In All

 

BufferQueue 和 gralloc

BufferQueue 将可生成图形数据缓冲区的组件(生产者)连接到接受数据以便进行显示或进一步处理的组件(消费者)。通过供应商专用 HAL 接口实现的 gralloc 内存分配器将用于执行缓冲区分配任务。

BufferQueue 包含将图像流生产方与图像流消耗方结合在一起的逻辑。

BufferQueue 是将缓冲区池与队列相结合的数据结构,它使用 Binder IPC 在进程之间传递缓冲区。

 

BufferQueue 可以在三种不同的模式下运行:

  - 默认情况下,BufferQueue 在类同步模式下运行

  - BufferQueue 还可以在非阻塞模式下运行

  - 舍弃模式  

 

SurfaceFlinger& Hardware Composer

SurfaceFlinger 接受来自多个源的数据缓冲区,然后将它们进行合成并发送到显示屏。Hardware Composer HAL (HWC) 确定使用可用硬件合成缓冲区的最有效的方法。

Hardware Composer HAL (HWC) 由 SurfaceFlinger 用来将 Surface 合成到屏幕。HWC 可以抽象出叠加层和 2D 位块传送器等对象,有助于分载通常使用 OpenGL 完成的一些工作。

Android 7.0 包含新版本的 HWC (HWC2),由 SurfaceFlinger 用来与专门的窗口合成硬件进行通信。SurfaceFlinger 包含使用 3D 图形处理器 (GPU) 执行窗口合成任务的备用路径 。

 

HWC regular rules

  • HWC 应至少支持 4 个叠加层(状态栏、系统栏、应用和壁纸/背景)。
  • 层可以大于屏幕,因此 HWC 应能处理大于显示屏的层(例如壁纸)。
  • 应同时支持预乘每像素 Alpha 混合和每平面 Alpha 混合。
  • HWC 应能消耗 GPU、相机和视频解码器生成的相同缓冲区,因此支持以下某些属性很有帮助:
    • RGBA 打包顺序
    • YUV 格式
    • 平铺、重排和步幅属性
  • 为了支持受保护的内容,必须提供受保护视频播放的硬件路径。

 

HWC2层和显示设备句柄

层和显示设备由不透明的句柄操纵。

当 SurfaceFlinger 想要创建新层时,它会调用 createLayer 函数,然后返回一个 hwc2_layer_t 类型的不透明句柄。在此之后,SurfaceFlinger 每次想要修改该层的属性时,都会将该 hwc2_layer_t 值以及进行修改所需的任何其他信息传递给相应的修改函数。hwc2_layer_t 类型句柄的大小足以容纳一个指针或一个索引,并且 SurfaceFlinger 会将其视为不透明,从而为 HWC 实现人员提供最大的灵活性。

以上大部分内容也适用于显示设备句柄,尽管根据句柄是热插拔(其中句柄通过热插拔回调传递)还是应客户端请求作为虚拟显示设备(句柄从 createVirtualDisplay 返回),会以不同的方式创建句柄。

 

显示设备合成操作

如果 SurfaceFlinger 具有可合成的新内容,则会唤醒,且每个硬件 vsync 唤醒一次。该新内容可以是来自应用的新图像缓冲区,也可以只是一个或多个层的属性更改。当 SurfaceFlinger 唤醒时,会执行以下步骤:

  1. 应用事务(如果存在)。包括由窗口管理器指定的层的属性更改,但不包括层的内容更改(例如来自应用的图形缓冲区)。
  2. 如果存在新的图形缓冲区,则将其锁定(从它们各自的应用获取其句柄)。
  3. 如果步骤 1 或 2 导致显示内容更改,则执行新的合成(如下所述)。

最后,在验证所有状态并且执行客户端合成(如果需要)后,SurfaceFlinger 将会调用 presentDisplay。这会提示 HWC 设备完成合成过程并显示最终结果。

 

SurfaceFlinger & OpenGL

SurfaceFlinger 就像另一个 OpenGL ES 客户端一样工作。例如,当 SurfaceFlinger 正在积极地将一个缓冲区或两个缓冲区合成到第三个缓冲区中时,它使用的是 OpenGL ES。

 

Surface , BufferQueue & SurfaceFlinger

新的 Surface 是 BufferQueue 的生产者端,其消费者是 SurfaceFlinger 层。BufferQueues 是 Android 图形组件之间的粘合剂。它们是一对队列,可以调解缓冲区从生产方到消耗方的固定周期。一旦生产方移交其缓冲区,SurfaceFlinger 便会负责将所有内容合成到显示部分。您可以使用任意提供 BufferQueue 的机制(例如,提供 Surface 的 Canvas 函数)来更新 Surface,附加 EGLSurface 并使用 GLES 进行绘制,或者配置 MediaCodec 视频解码器以便于写入。Surface 可生成一个通常由 SurfaceFlinger 使用的缓冲区队列。当渲染到 Surface 上时,结果最终将出现在传送给消费者的缓冲区中。

 

SurfaceView & SurfaceTexture

 就像SurfaceView 是 Surface 和 View 的组合一样,SurfaceTexture 是 Surface 和 GLES 纹理的粗略组合(包含几个注意事项)。

 

同步框架 ?

 

 

同步栅栏

 

posted @ 2021-02-10 14:39  Saymour2008  阅读(75)  评论(0)    收藏  举报