当前位置: 首页 > news >正文

【SF】在 Android 显示系统中,图层合成方式 Device 和 Client 的区别

SurfaceFlinger 详细分析报告

Display 0 (active) HWC layers:
---------------------------------------------------------------------------------------------------------------------------------------------------------------Layer nameZ |  Window Type |  Comp Type |  Transform |   Disp Frame (LTRB) |          Source Crop (LTRB) |     Frame Rate (Explicit) (Seamlessness) [Focused]
---------------------------------------------------------------------------------------------------------------------------------------------------------------bbq-wrapper#1rel      0 |            0 |     DEVICE |          0 |    0    0 1920 1080 |    0.0    0.0 1920.0 1080.0 |                                              [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------xxx.ui.confctrl.ConfCtrlActivity#0rel      0 |            1 |     CLIENT |          0 |    0    0 1920 1080 |    0.0    0.0 1920.0 1080.0 |                                              [*]
---------------------------------------------------------------------------------------------------------------------------------------------------------------#0rel      0 |         2038 |     CLIENT |          0 |    0    0 1920   66 |    0.0    0.0 1920.0   66.0 |                                              [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------Planner is disabled
h/w composer state:h/w composer enabled
-- HWC2 Version HWC2-XXX --DisplayId=0, Connector 431, Type = HDMI-A-1, Connector state = DRM_MODE_CONNECTEDNumHwLayers=3, activeModeId=1182, 1920x1080p60.00, colorMode = 0, bStandardSwitchResolution=0
------+-----+-----------+-----------+--------------------+-------------+------------+--------------------------------+------------------------+------------+--------+------------id  |  z  |  sf-type  |  hwc-type |       handle       |  transform  |    blnd    |     source crop (l,t,r,b)      |          frame         | dataspace  |  mFps  | name       
------+-----+-----------+-----------+--------------------+-------------+------------+--------------------------------+------------------------+------------+--------+------------0050 | 000 |    Device |    Device | 00b4000073ce04a5b0 | None        | None       |    0.0,    0.0, 1920.0, 1080.0 |    0,    0, 1920, 1080 |          0 |  60.0  | bbq-adapter#0(BLAST Consumer)0 | 0x197000000300049 | 001 |    Device |    Client | 00b4000073ce048470 | None        | Premultipl |    0.0,    0.0, 1920.0, 1080.0 |    0,    0, 1920, 1080 |          0 |   0.0  | ViewRootImpl[ConfCtrlActivity]#8(BLAST Consumer)8 | 0x197000000740048 | 002 |    Device |    Client | 00b4000073ce049430 | None        | Premultipl |    0.0,    0.0, 1920.0,   66.0 |    0,    0, 1920,   66 |          0 |   0.0  | ViewRootImpl[]#7(BLAST Consumer)7 | 0x19700000071
------+-----+-----------+-----------+--------------------+-------------+------------+--------------------------------+------------------------+------------+--------+------------
DrmHwcLayer Dump:
DrmHwcLayer[  50] Buffer[w/h/s/bs/format]=[3840,2160,3840,2160,3840,  21] Fourcc=NV12 Transform=None    (0x1) Blend[a=255]=NONE     source_crop[l,t,r,b]=[    0,    0, 1920, 1080] display_frame[l,t,r,b]=[   0,   0,1920,1080],skip=0,afbcd=0 hdr=0 fps=59.988098 
DrmHwcLayer[  49] Buffer[w/h/s/bs/format]=[1920,1080,1920,1088,7680,   1] Fourcc=AB24 Transform=None    (0x1) Blend[a=255]=PREMULT  source_crop[l,t,r,b]=[    0,    0, 1920, 1080] display_frame[l,t,r,b]=[   0,   0,1920,1080],skip=0,afbcd=1 hdr=0 fps=60.000000 
DrmHwcLayer[  48] Buffer[w/h/s/bs/format]=[1920,  66,1920,  66,7680,   1] Fourcc=AB24 Transform=None    (0x1) Blend[a=255]=PREMULT  source_crop[l,t,r,b]=[    0,    0, 1920,   66] display_frame[l,t,r,b]=[   0,   0,1920,  66],skip=0,afbcd=0 hdr=0 fps=60.000000 
DrmHwcFBtar[   0] Buffer[w/h/s/bs/hs/format]=[1920,1080,1920,1080,7680,   1] Fourcc=AB24 Transform=None    (0x1) Blend[a=255]=PREMULT  source_crop[l,t,r,b]=[    0,    0, 1920, 1080] display_frame[l,t,r,b]=[   0,   0,1920,1080],afbcd=0 hdr=0 fps=0.000000 DisplayId=1, Connector 445, Type = HDMI-A-2, Connector state = DRM_MODE_DISCONNECTEDDisplayId=2, Connector 459, Type = DP-1, Connector state = DRM_MODE_DISCONNECTED

1. 概述

SurfaceFlinger 是 Android 系统的显示合成服务,负责管理所有应用窗口的合成和显示。这份 dumpsys SurfaceFlinger 输出提供了当前显示系统的详细状态信息,包括图层(Layer)信息、硬件合成器(HWC)状态和显示设备配置。

2. 显示设备信息

2.1 活动显示设备(Display 0)

  • 连接器类型: HDMI-A-1
  • 连接状态: DRM_MODE_CONNECTED (已连接)
  • 活动分辨率: 1920x1080p60.00
  • 颜色模式: 0 (默认模式)
  • HWC版本: HWC2-XXX

2.2 其他显示设备

  • Display 1 (HDMI-A-2): 未连接(DRM_MODE_DISCONNECTED)
  • Display 2 (DP-1): 未连接(DRM_MODE_DISCONNECTED)

3. HWC图层分析

3.1 图层列表概览

系统当前有三个活跃图层:

IDZ-order类型合成方式缓冲区句柄变换混合模式源裁剪区域显示帧区域数据空间帧率名称
00500DeviceDevice00b4000073ce04a5b0NoneNone0,0,1920,10800,0,1920,1080060.0bbq-adapter#0
00491DeviceClient00b4000073ce048470NonePremultipl0,0,1920,10800,0,1920,108000.0ViewRootImpl[ConfCtrlActivity]#8
00482DeviceClient00b4000073ce049430NonePremultipl0,0,1920,660,0,1920,6600.0ViewRootImpl[]#7

3.2 各图层详细分析

3.2.1 图层0050 (bbq-adapter#0)
  • 类型: 设备层(Device)
  • 合成方式: 硬件合成(DEVICE)
  • 缓冲区格式: NV12 (YUV420半平面格式)
  • 缓冲区尺寸: 3840x2160 (可能是4K下采样到1080p)
  • 源裁剪区域: 0,0,1920,1080
  • 显示帧区域: 全屏(0,0,1920,1080)
  • 帧率: 59.988098 fps (接近60Hz)
  • 特性: 基础显示层,无混合模式
3.2.2 图层0049 (ConfCtrlActivity)
  • 类型: 设备层(Device)但合成方式为Client
  • 缓冲区格式: AB24 (可能是ARGB8888)
  • 缓冲区尺寸: 1920x1080
  • 源裁剪区域: 0,0,1920,1080
  • 显示帧区域: 全屏(0,0,1920,1080)
  • 帧率: 0.0 (由应用控制)
  • 特性: 预乘Alpha混合(PREMULT)
3.2.3 图层0048 (系统UI层)
  • 类型: 设备层(Device)但合成方式为Client
  • 缓冲区格式: AB24
  • 缓冲区尺寸: 1920x66
  • 源裁剪区域: 0,0,1920,66
  • 显示帧区域: 顶部状态栏区域(0,0,1920,66)
  • 帧率: 0.0
  • 特性: 预乘Alpha混合

4. 关键发现

  1. 合成策略:

    • Planner(合成计划器)被禁用
    • 硬件合成器(HWC)已启用
    • 所有图层都标记为"Device"类型,但实际合成方式有DEVICE和CLIENT混合
  2. 性能指标:

    • 主显示层(0050)保持接近60fps的刷新率
    • 应用层(0049)和系统UI层(0048)没有固定帧率,由应用控制
  3. 内存使用:

    • 主显示层使用NV12格式(YUV),节省内存带宽
    • 应用层使用AB24格式(可能是ARGB8888),每个像素4字节

5. 潜在问题

  1. 合成方式不一致:

    • 虽然所有图层标记为"Device"类型,但实际合成方式有DEVICE和CLIENT混合,可能导致性能不是最优
  2. 帧率差异:

    • 主显示层60fps与应用层0fps的组合可能导致偶尔的卡顿
  3. 分辨率处理:

    • 主显示层缓冲区尺寸(3840x2160)大于实际显示分辨率(1920x1080),可能存在不必要的缩放

6. 建议

  1. 优化合成策略:

    • 检查为什么Planner被禁用
    • 统一图层的合成方式,尽可能使用硬件合成
  2. 帧率同步:

    • 考虑将应用层帧率与显示刷新率同步
  3. 内存优化:

    • 评估是否可以更多使用YUV格式节省内存带宽
    • 检查是否有必要使用4K缓冲区进行1080p显示

这份分析表明系统显示合成基本正常工作,但存在一些优化空间,特别是在合成策略和内存使用方面。


在 Android 显示系统中,Device(设备)合成Client(客户端)合成是两种不同的图层处理方式,它们直接影响系统性能、功耗和显示效果。以下是它们的核心区别:


1. 本质区别

特性Device (硬件合成)Client (GPU合成)
执行者显示控制器(Display Controller/HWC)GPU(通过OpenGL/DirectX)
硬件支持需要SoC显示硬件加速模块依赖通用GPU计算
功耗极低(专用电路处理)较高(GPU参与计算)
延迟更低相对较高
适用场景简单图层(无复杂变换/混合)复杂效果(透明度、动画、3D变换等)

2. 技术细节对比

Device合成(硬件加速)
  • 工作原理
    由显示控制器的专用硬件直接处理图层,不经过GPU。
    App Surface → HWC → Display
    
  • 优势
    • 省电:硬件专用电路功耗远低于GPU
    • 低延迟:避免GPU渲染管线开销
    • 支持Overlay:可直接叠加到显示缓冲区(如视频播放)
  • 限制
    • 功能有限:仅支持基本操作(平移、缩放、简单混合)
    • 图层数受限:取决于硬件Overlay数量(通常4-8层)
Client合成(GPU渲染)
  • 工作原理
    GPU通过OpenGL/Vulkan将多个图层合成一个帧缓冲区。
    App Surface → GPU (Composition) → HWC → Display
    
  • 优势
    • 功能强大:支持任意变换、透明度、阴影等效果
    • 无图层数限制:由GPU性能决定
  • 缺点
    • 高功耗:GPU激活增加耗电
    • 内存带宽压力:需传输更多数据到GPU
    • 可能引起卡顿:复杂合成占用GPU资源

3. 实际场景分析

为什么某些图层标记为Device却使用Client合成?

在输出中,图层0049和0048虽然标记为Device类型,但实际使用Client合成,可能因为:

  1. 硬件限制
    • HWC的Overlay数量已满(如0050占用了最后一个硬件Overlay)
  2. 功能不支持
    • 图层需要GPU才能实现的特性(如复杂透明度)
  3. 动态策略
    • SurfaceFlinger根据负载动态切换合成方式
典型Device合成场景
  • 全屏视频播放(NV12格式直接送显)
  • 静态壁纸
  • 简单的2D UI元素(无动画)
典型Client合成场景
  • 带有Alpha通道的复杂动画
  • 多窗口叠加(如分屏模式)
  • 3D游戏界面

4. 性能影响

  • 功耗差异
    Client合成的功耗可能是Device合成的2-5倍(取决于GPU效率)。
  • 帧率稳定性
    Device合成可保证60fps无抖动,Client合成可能因GPU负载导致掉帧。

5. 开发者注意事项

  1. 优化建议
    // 在View上禁用不必要的透明度(促进Device合成)
    view.setHasOverlappingRendering(false); 
    
  2. 调试命令
    adb shell dumpsys SurfaceFlinger --dispsync   # 查看合成策略
    adb shell dumpsys SurfaceFlinger --latency    # 分析合成延迟
    
  3. 问题定位
    若发现异常功耗,检查是否有本应Device合成的图层被降级到Client合成。

6. Rockchip平台的特殊性

从输出可见:

  • 使用了BLAST架构(Buffer Layout and Surface Tiling),这是Android 10+的现代合成协议
  • AB24格式可能是Rockchip的私有格式(类似ARGB8888)

总结

决策因素选择Device合成选择Client合成
优先级尽可能多用不得已时使用
检查指标图层是否简单、无透明、无复杂变换是否需要GPU特效
优化目标省电、低延迟功能实现

理解这两种合成方式的区别,有助于诊断显示性能问题和优化Android应用的渲染效率。

相关文章:

  • 信创系统资产清单采集脚本:主机名+IP+MAC 一键生成 CSV
  • 汽车产业链主表及类别表设计
  • 2、Linux操作系统下,ubuntu22.04版本安装搜狗输入法
  • ACM会议模板设置单排作者数量
  • 低压电工常见知识点
  • Java——琐碎知识点一
  • 国家与省市县 标准地图服务网站 审图号地图下载
  • 【愚公系列】《Manus极简入门》005-DeepSeek与Manus的创新之处
  • camera知识学习
  • 金融数据分析(Python)个人学习笔记(13):自然语言处理
  • 服务器备份,服务器想要备份文件内容有哪些方法?
  • Arduino 入门学习笔记(五):KEY实验
  • PTA -L1-005 考试座位号
  • WPF-遵循MVVM框架创建图表的显示【保姆级】
  • SpringCloud核心组件Eureka菜鸟教程
  • LaTex、pdfLaTex、XeLaTex和luaLaTex的区别和联系
  • Docker常见命令
  • 关于指针和指针算术
  • 开发常使用的团队协作工具
  • 再谈从视频中学习:从给视频打字幕的Humanoid-X、UH-1到首个人形VLA Humanoid-VLA:迈向整合第一人称视角的通用人形控制
  • 全过程人民民主研究基地揭牌,为推动我国民主政治建设贡献上海智慧
  • 持续更新丨伊朗港口爆炸事件已致406人受伤
  • 11-13世纪的地中海贸易
  • “两高”司法解释:升档为境外非法提供商业秘密罪的量刑标准
  • 教培机构向学员提供盗版教材,法院:应承担著作权侵权责任
  • 首映|国家自博馆4D电影《海洋深深》:潜入深海向地球发问