主页 > IT业界  > 

SurfaceComposerClient

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 请求创建 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