andorid 13中 "SurfaceFlinger 的主线程 扫描所有的 Surface 对象" 相关的 代码
时间: 2024-02-13 13:02:40 浏览: 201
在 Android 13 中,SurfaceFlinger 的主线程扫描所有的 Surface 对象的代码主要是由 `SurfaceFlinger::onMessageRefresh` 方法实现的。该方法是主线程的消息处理函数,当主线程收到“刷新”消息时,就会调用该方法。
具体来说,`SurfaceFlinger::onMessageRefresh` 方法的代码路径如下:
1. 遍历 SurfaceFlinger 中的所有 Layer(即 Surface 对象),并检查它们的状态是否发生了改变。这个过程是由主线程中的 `mDrawingState.traverseInZOrder` 方法实现的,该方法会遍历所有的 Layer,并调用每个 Layer 的 `onPreComposition` 方法来检查它们的状态。
2. 如果某个 Layer 的状态发生了改变,就会调用相应的客户端进程,要求其重新提交该 Layer 的缓冲区。这个过程是由 `SurfaceFlinger::postComposition` 方法实现的,该方法会遍历所有的 Layer,并调用每个 Layer 的 `onPostComposition` 方法来通知客户端进程。
3. 如果客户端进程提交了新的缓冲区,就会将这些缓冲区合成到一个帧缓冲区中,并在下一次屏幕刷新时将其发送到显示器。这个过程是由主线程中的 `composeSurfaces` 和 `drawWormhole` 方法实现的,它们会将所有的 Layer 缓冲区合成到一个帧缓冲区中,并在需要时添加虫洞(Wormhole)层用于处理透明度。
下面是 `SurfaceFlinger::onMessageRefresh` 方法的伪代码:
```cpp
void SurfaceFlinger::onMessageRefresh() {
// 遍历所有的 Layer,并检查它们的状态是否发生了改变
mDrawingState.traverseInZOrder([&](Layer* layer) {
// 调用每个 Layer 的 onPreComposition 方法来检查它们的状态
layer->onPreComposition();
});
// 如果某个 Layer 的状态发生了改变,就通知客户端进程重新提交缓冲区
postComposition();
// 将所有的 Layer 缓冲区合成到一个帧缓冲区中,并添加虫洞层
composeSurfaces();
drawWormhole();
}
```
阅读全文