SurfaceComposerClient
- IT业界
- 2025-09-02 07:39:02

大多数客户端(应用进程)和 SurfaceFlinger 交互时,都会经过 SurfaceComposerClient,但也有一些特殊情况可以绕过它。
1. SurfaceComposerClient 的主要作用
SurfaceComposerClient 是 SurfaceFlinger 提供的 客户端 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);这段代码会:
通过 SurfaceComposerClient 向 SurfaceFlinger 请求创建 SurfaceSurfaceFlinger 创建对应的 Layer 并返回 SurfaceControl客户端可以通过 SurfaceControl 进行后续操作,比如 提交 Buffer、设置显示属性2. 但是,并不是所有客户端都必须经过 SurfaceComposerClient
虽然大多数情况需要 SurfaceComposerClient,但有些特例:
✅ (1) 直接通过 BufferQueue 交互一些系统组件(如 SurfaceView、TextureView)内部可能不直接使用 SurfaceComposerClient,而是:
由 WindowManager 代理 SurfaceComposerClient 创建 Surface应用端只通过 BufferQueue(BLASTBufferQueue)和 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
当 SurfaceView 被 HWC 直接合成时,GraphicBuffer 直接传递给 HWC,不需要 RenderEngine 处理这种情况下,SurfaceComposerClient 可能不会显式调用,但 BufferQueue 仍然是和 SurfaceFlinger 交互的核心3. 结论 情况是否必须 SurfaceComposerClient交互方式普通应用创建 Surface✅ 必须SurfaceComposerClient → SurfaceFlinger使用 TextureView❌ 不一定BufferQueue 直接交互HWC 直接合成 Layer❌ 不一定BufferQueue 直接传输 GraphicBuffer系统组件(如 System UI)✅ 一般需要依赖 SurfaceComposerClient 创建 Surface
SurfaceComposerClient由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“SurfaceComposerClient”
下一篇
MySQL学习笔记:从基础到进阶