SurfaceComposerClient
大多数客户端(应用进程)和 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
请求创建Surface
SurfaceFlinger
创建对应的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 |