bool SurfaceFlinger::handleMessageInvalidate() {
ATRACE_CALL();
bool refreshNeeded = handlePageFlip();
// Send on commit callbacks
mTransactionCallbackInvoker.sendCallbacks();
if (mVisibleRegionsDirty) {
computeLayerBounds();
}
for (auto& layer : mLayersPendingRefresh) {
Region visibleReg;
visibleReg.set(layer->getScreenBounds());
invalidateLayerStack(layer, visibleReg);
}
mLayersPendingRefresh.clear();
return refreshNeeded;
}
- 调用 SurfaceFlinger::handlePageFlip(),它调用 BufferLayer::latchBuffer() 尝试锁定一个 buffer,如果锁定成功则计算脏区域,返回值表示是否需要刷新。
- 调用
sendCallbacks()
,它回调 onTransactionCompleted()
通知客户端事务完成。
- 如果有可见脏区域,调用
computeLayerBounds()
,它遍历 mDrawingState
中的 layer,调用 Layer 的 computeBounds()
。
- 遍历
mLayersPendingRefresh
,调用 invalidateLayerStack()
更新屏幕脏区域。