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

SurfaceComposerClient

大多数客户端(应用进程)和 SurfaceFlinger 交互时,都会经过 SurfaceComposerClient,但也有一些特殊情况可以绕过它。


1. SurfaceComposerClient 的主要作用

SurfaceComposerClientSurfaceFlinger 提供的 客户端 API,用于创建和管理 Surface,其主要功能包括:

  • 创建 Layer(通过 createSurface()
  • 更新 Layer 状态(比如 setLayer(), setPosition()
  • 控制 BufferQueue(用于管理 GraphicBuffer
  • 提交事务SurfaceControl::applyTransaction()

📌 代码示例(应用侧创建 Surface)

sp<SurfaceComposerClient> client = new SurfaceComposerClient();
sp<SurfaceControl> surfaceControl = client->createSurface(String8("MySurface"),
        1080, 1920, PIXEL_FORMAT_RGBA_8888, 0);

这段代码会:

  1. 通过 SurfaceComposerClientSurfaceFlinger 请求创建 Surface
  2. SurfaceFlinger 创建对应的 Layer 并返回 SurfaceControl
  3. 客户端可以通过 SurfaceControl 进行后续操作,比如 提交 Buffer设置显示属性

2. 但是,并不是所有客户端都必须经过 SurfaceComposerClient

虽然大多数情况需要 SurfaceComposerClient,但有些特例:

✅ (1) 直接通过 BufferQueue 交互

一些系统组件(如 SurfaceViewTextureView)内部可能不直接使用 SurfaceComposerClient,而是:

  1. WindowManager 代理 SurfaceComposerClient 创建 Surface
  2. 应用端只通过 BufferQueueBLASTBufferQueue)和 SurfaceFlinger 交互

📌 示例:TextureView 不直接创建 Surface

  • TextureView 不会自己调用 SurfaceComposerClient,而是依赖 WindowManager 创建 Surface,然后应用端 直接通过 BufferQueue 传输 GraphicBuffer
  • 这意味着 应用端和 SurfaceFlinger 交互主要依靠 BufferQueue,而不是 SurfaceComposerClient

✅ (2) HWC 直接处理 Layer

  • 如果 SurfaceFlinger 检测到 HWC(Hardware Composer)能直接合成 GraphicBuffer,那么 SurfaceFlinger 可能不会显式调用 SurfaceComposerClient 来管理 Layer,而是:
    • 直接 BufferQueue 获取 GraphicBuffer
    • 交给 HWC 进行直接显示

📌 示例:HWC 直接合成 SurfaceView

  • SurfaceViewHWC 直接合成时,GraphicBuffer 直接传递给 HWC,不需要 RenderEngine 处理
  • 这种情况下,SurfaceComposerClient 可能不会显式调用,但 BufferQueue 仍然是和 SurfaceFlinger 交互的核心

3. 结论

情况是否必须 SurfaceComposerClient交互方式
普通应用创建 Surface✅ 必须SurfaceComposerClientSurfaceFlinger
使用 TextureView❌ 不一定BufferQueue 直接交互
HWC 直接合成 Layer❌ 不一定BufferQueue 直接传输 GraphicBuffer
系统组件(如 System UI✅ 一般需要依赖 SurfaceComposerClient 创建 Surface

相关文章:

  • DeepSeek01-本地部署大模型
  • Vite 在生产环境下的打包策略
  • Uniapp 从入门到精通:组件与 API 的深度剖析
  • 【GESP C++三级考试考点详细解读】
  • 年前集训总结python
  • 使用vue2 脚手架 结合 Element UI 写一个电商商城前端静态网站模板-前端项目练习
  • 日做力扣题1--3. 无重复字符的最长子串
  • fastapi+vue实现按钮级别的权限控制
  • Golang学习笔记_33——桥接模式
  • oracle between and包含边界
  • 罗德与施瓦茨ZNB20,矢量网络分析仪9KHz-20GHz
  • Redis集群主从切换源码解读
  • MySQL 学习笔记:从基础到进阶
  • 格瑞普推出革命性半固态电池,为行业无人机续航注入未来动力
  • ib网络状态探测
  • 低代码系统-产品架构案例介绍、某PaaS(十四)
  • 如何简单的去使用jconsloe 查看线程 (多线程编程篇1)
  • 深度学习和机器学习的本质区别(白话版)
  • 基于FPGA的制冷型红外成像电路设计(论文+图纸)
  • 基于SpringBoot+vue+uniapp的投票小程序+LW示例参考
  • “典孝急乐批麻蚌赢”:互联网“八字真言”与当代赛博赢学
  • 美凯龙:董事兼总经理车建兴被立案调查并留置
  • 习近平出席中国-拉美和加勒比国家共同体论坛第四届部长级会议开幕式并发表重要讲话
  • 新闻1+1丨婚姻登记服务,如何跑出幸福加速度?
  • 郑州通报涉“健康证”办理有关问题查处进展情况
  • 江西吉水通报一男子拒服兵役:不得考公,两年内经商、升学等受限