andorid 12中, SurfaceFlinger 如何 扫描所有的 Surface 对象
时间: 2024-02-13 20:02:44 浏览: 28
在 Android 12 中,SurfaceFlinger 的主线程会定期扫描系统中所有的 Surface 对象,并检查它们的状态是否发生了改变。这个过程是由主线程的消息循环和 Surface 对象列表实现的。
具体来说,主线程会执行一个消息循环,等待收到消息后进行处理。当主线程收到“刷新”消息时,它会遍历 Surface 对象列表,并依次检查每个 Surface 对象的状态是否发生了改变。这个过程是通过遍历Surface 对象列表来实现的,每个 Surface 对象都有自己的状态,包括其位置、大小、透明度、缩放等等。主线程会检查每个 Surface 对象的状态,并确定是否需要更新该 Surface 对象的缓冲区。
具体实现的代码位于 `SurfaceFlinger::onMessageRefresh` 函数中,这是主线程的消息处理函数,当主线程收到“刷新”消息时,就会调用该函数。下面是伪代码:
```cpp
void SurfaceFlinger::onMessageRefresh() {
// 遍历所有的 Surface 对象,并检查它们的状态是否发生了改变
for (auto& layer : mCurrentState.layersSortedByZ) {
// 调用每个 Surface 对象的 onPreComposition 方法来检查它们的状态
layer->onPreComposition();
}
// 如果某个 Surface 对象的状态发生了改变,就通知客户端进程重新提交缓冲区
postComposition();
// 将所有的 Surface 对象缓冲区合成到一个帧缓冲区中,并添加虫洞层
composeSurfaces();
drawWormhole();
}
```
在这个函数中,`mCurrentState.layersSortedByZ` 是 Surface 对象列表,`layer->onPreComposition()` 方法会检查 Surface 对象的状态并更新其缓冲区,`postComposition()` 方法会通知客户端进程重新提交缓冲区,`composeSurfaces()` 和 `drawWormhole()` 方法会将所有的 Surface 对象缓冲区合成到一个帧缓冲区中,并添加虫洞层用于处理透明度。