Android HWC(Hardware Composer)

usesClientComposition & usesDeviceComposition

这两个标记,是 HWC 告诉 SurfaceFlinger:这一帧画面,到底该谁来合成?

  • usesClientComposition = true

    • 需要 GPU 合成(客户端合成)
    • SF 必须用 OpenGL 把图层先画到一张图上
  • usesDeviceComposition = true

    • 需要硬件合成(设备/HWC 合成)
    • 直接用 DRM Plane / 硬件 Overlay 叠加

1.1 state.usesClientComposition

含义:这一帧必须走 GPU 合成。

1.1.1 什么时候会变成 true?

只要有任何一个图层无法用硬件 Plane 叠加,HWC 就会把它设为 true。

典型原因:

  • 图层有旋转、大缩放
  • 复杂混合模式、遮罩、裁剪
  • 图层数量超过硬件 Plane 数量(DRM Plane 一般只有 3~4 个)
  • 特效、模糊、动画

1.1.2 对 SurfaceFlinger 意味着什么?

SF 必须先把所有“不能硬件叠加”的图层用 GPU 合成一张大图
→ 这张图叫 Client Target
→ 最后再交给 HWC 硬件输出

1.2 state.usesDeviceComposition

含义:这一帧可以(也必须)用硬件合成。
只要有任何一个图层被 HWC 标记为:

setLayerCompositionType(LAYER_TYPE_DEVICE)

那么这个标记就会变成 true。

1.2.1 对 SurfaceFlinger 意味着什么?

  • 这些图层完全不经过 GPU
  • 直接由显示硬件(DRM Plane / Overlay)叠加
  • 省电、不占 GPU、低延迟

1.3 最关键的规则(HWC 工作核心)

一帧画面里,这两个标记可以同时为 true!
也就是:

  • 一部分图层 → GPU 合成(Client)
  • 一部分图层 → 硬件合成(Device)
  • 最后 HWC 把两部分合在一起输出到屏幕
    这就是 Android 显示系统最经典的混合合成模式

2 HWC 里的 layer

**在 HWC 里,layer = 一个要显示的“图层”**就是 SurfaceFlinger 传给 HWC 的、一个独立的画面单元

2.1 HWC 里,layer 用最简单的话讲

你手机屏幕上看到的每一块独立画面,在 HWC 眼里都是一个 layer

  • 微信界面 → 1 个 layer
  • 状态栏(时间、电量)→ 1 个 layer
  • 导航栏(返回键)→ 1 个 layer
  • 视频播放画面 → 1 个 layer
  • 壁纸 → 1 个 layer

HWC 的工作,就是管理一堆 layers,决定:

  • 谁用硬件叠加(DEVICE)
  • 谁用 GPU 合成(CLIENT)

2.2 一个 layer 里面有什么?

HWC 里的一个 layer 包含显示一块画面需要的所有信息

  1. buffer
    真正的图像数据(纹理/帧缓冲)
  2. 位置、大小 (x, y, w, h)
  3. 透明度 (alpha)
  4. Z 序(谁在上面,谁在下面)
  5. 合成类型
    • DEVICE:硬件叠加
    • CLIENT:GPU 合成
  6. 裁剪、旋转、缩放

2.3 关键区分(非常重要)

很多人搞混 3 个东西,我一次性分清:

概念所在位置含义
App SurfaceApp 里面应用画的窗口
SurfaceFlinger LayerSF 里面SF 管理的窗口单元
HWC LayerHWC 里面SF 传给 HWC、用于硬件合成的图层

关系:

App Surface
    ↓
SF Layer
    ↓
HWC Layer (你问的这个)
  • HWC Layer 就是 SF 把窗口信息打包发给硬件合成器的最终格式。

2.4 用 Linux DRM 类比

HWC Layer = DRM Plane 的“数据源”

  • DRM Plane = 硬件图层通道
  • HWC Layer = 要送到 Plane 上显示的内容

HWC 做的事:
把一个个 layer 分配到一个个 DRM Plane

2.4 最核心的作用(HWC 为什么需要 layer?)

HWC 不关心这是微信还是状态栏,
HWC 只看 layer:

  • 这个 layer 能不能用硬件叠加?
  • 这个 layer 要放在屏幕哪个位置?
  • 这个 layer 要给 GPU 还是给硬件?
    HWC 的整个工作,就是处理一堆 layers。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值