sf学习之 SurfaceControl 初始化

本文深入探讨了Android中SurfaceControl的初始化过程,从vsync-app信号上行开始,详细介绍了SurfaceSession和SurfaceControl的native初始化,包括Choreographer如何处理VSYNC信号,以及在ViewRootImpl中如何创建和使用SurfaceControl。文章还分析了SurfaceFlinger进程中的Client::createSurface操作,最终形成一个完整的SurfaceControl初始化流程。

vsync-app 信号上行

应用层主要通过Choreographer 来请求、接收 VSYNC 信号,通知应用开始绘制界面,现在从收到Native层上报的 VSYNC 信号开始👀:
在 Choreographer 的内部类FrameDisplayEventReceiver.onVsync 方法中通过 handler 分发消息,在 run 方法中接受处理:

frameworks/base/core/java/android/view/Choreographer.java
在这里插入图片描述doframe 方法主要做了几件事,计算帧率(掉帧打印),分发 CALLBACK_INPUT、CALLBACK_ANIMATION、CALLBACK_INSETS_ANIMATION、CALLBACK_TRAVERSAL、CALLBACK_COMMIT 事件,这里是应用处理输入事件、动画和界面绘制的关键:
在这里插入图片描述
在这里插入图片描述
其中 CALLBACK_TRAVERSAL 会调用 ViewRootImpl.scheduleTraversals
-> TraversalRunnable.doTraversal -> performTraversals
-> relayoutWindow
-> measure
-> layout
-> draw

relayoutW

### SurfaceFlinger 中的关键函数分析 SurfaceFlinger 是 Android 图形系统中的核心组件,负责管理多个 Layer 的合成与显示。其关键函数在初始化、状态管理、事务提交、线程调度等方面起着至关重要的作用。 #### `createSurfaceFlinger` 函数 该函数用于创建 SurfaceFlinger 的实例。它通过静态的 `DefaultFactory` 来构造一个 `SurfaceFlinger` 对象,确保全局唯一性。 ```cpp sp<SurfaceFlinger> createSurfaceFlinger() { static DefaultFactory factory; return new SurfaceFlinger(factory); } ``` 这个函数通常在系统服务启动时被调用,用于初始化图形合成的核心服务。 #### `SurfaceFlinger` 构造函数与 `readyToRun` SurfaceFlinger 继承自 `Thread` 类,因此必须实现 `readyToRun()` 和 `threadLoop()` 两个函数。`readyToRun()` 在线程启动前执行,用于初始化资源,例如创建图形上下文、初始化硬件合成器(HWComposer)等。 ```cpp SurfaceFlinger::SurfaceFlinger(const sp<Factory>& factory) : mFactory(factory), mEventQueue(new EventQueue(this)) { // 初始化其他资源 } ``` 在 `readyToRun()` 中,SurfaceFlinger 会初始化 VSync 控制、帧率检测器(FpsReporter)等关键组件,确保图形合成的时序和性能监控正常运行 [^3]。 #### `commitTransaction` 函数 该函数用于提交事务,通知 SurfaceFlinger 当前图层的状态(如 Z-order、透明度、几何变换等)已经更新完毕,可以进行下一次合成。在调用此函数之前,所有图层的属性修改都处于待定状态。 ```cpp void SurfaceFlinger::commitTransaction() { // 切换状态并通知合成器进行图层更新 } ``` 该函数通常在应用端完成对 SurfaceControl 的修改后调用,确保图层状态同步到 SurfaceFlinger 的主线程中 [^2]。 #### `threadLoop` 函数 SurfaceFlinger 作为一个线程类,其核心运行逻辑在 `threadLoop()` 中实现。该函数负责监听 VSync 信号、处理事件队列、执行图层合成等任务。 ```cpp bool SurfaceFlinger::threadLoop() { // 等待 VSync // 处理挂起的事务 // 执行合成 return true; // 返回 true 表示线程继续运行 } ``` 该函数持续运行,确保图形合成的实时性和流畅性。 #### `handleMessageTransaction` 函数 该函数用于处理图层属性的更新事务。它解析客户端发送的图层属性变更请求,如 Z-order、可见性、变换矩阵等,并将这些变更应用到内部的 Layer 状态中。 ```cpp void SurfaceFlinger::handleMessageTransaction() { // 遍历所有图层并更新属性 } ``` 该函数通常在 `commitTransaction` 被调用后触发,确保图层状态同步到合成流程中。 #### `handleMessageInvalidate` 函数 该函数用于处理图层内容的无效化请求。当某个图层的内容发生变化时,会触发此消息,通知 SurfaceFlinger 重新计算合成区域并进行刷新。 ```cpp void SurfaceFlinger::handleMessageInvalidate() { // 更新脏区域 // 请求合成 } ``` 该函数是 SurfaceFlinger 响应图层内容变化的核心机制之一。 #### `FpsReporter` 与 `RegionSamplingThread` SurfaceFlinger 还创建了 `FpsReporter` 和 `RegionSamplingThread` 等辅助线程。`FpsReporter` 负责实时监控帧率,并通过回调通知监听者;`RegionSamplingThread` 则用于对特定区域进行像素采样,支持截屏、动态调整等功能 [^4]。 ```cpp // 创建帧率检测器 sp<FpsReporter> mFpsReporter = new FpsReporter(); // 注册监听器 mFpsReporter->registerListener(listener); ``` 这些线程增强了 SurfaceFlinger 的调试与性能分析能力。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值