从systrace看app冷启动过程(三)-首帧的合成与送显

接上篇,RenderThread完成了渲染,最终通过queueBuffer把保存了数据的buffer扔给SurfaceFlinger等待合成。

queueBuffer是一个binder call(默认surfaceFlinger binder线程数为4),对端是SurfaceFlinger,如下图所示:

从systrace看app冷启动过程(三)-首帧的合成与送显_第1张图片

之前介绍过,SurfaceFlinger初始化好之后,主线程run方法会执行MessageQueue.cpp中的waitForEvent等待接收消息。

一旦有视图变化就会发起invalidate vsync请求,waitForEvent稍后会接收到对应invalidate消息进行处理,正常情况下surfaceFlinger处理消息间隔保持在16.6ms之间,而queueBuffer过程本身就会发起invalidate vsync请求。

从systrace看app冷启动过程(三)-首帧的合成与送显_第2张图片

接着看接收到数据的处理:

onMessageReceived接收两种消息:invalidate和refresh:

1774void SurfaceFlinger::onMessageReceived(int32_t what) {
1775    ATRACE_CALL();
1776    switch (what) {
1777        case MessageQueue::INVALIDATE: {
                …
                   //判断是否满足刷新需求
1814            bool refreshNeeded = handleMessageTransaction();
1815            refreshNeeded |= handleMessageInvalidate();
1816            refreshNeeded |= mRepaintEverything;
1817            if (refreshNeeded && CC_LIKELY(mBootStage != BootStage::BOOTLOADER)) {
1818                // Signal a refresh if a transaction modified the window state,
1819                // a new buffer was latched, or if HWC has requested a full
1820                // repaint
1821                if (mDolphinFuncsEnabled) {
1822                    mDolphinRefresh();
1823                }
1824                signalRefresh();//如果满足要求,则发送refresh vsync请求执行REFRESH操作
1825            }
1826            break;
1827        }
1828        case MessageQueue::REFRESH: {
1829            handleMessageRefresh();
1830            break;
1831        }
1832    }
1833}

先看左边,即接收INVALIDATE消息:

在RenderThread swapBuffer过程中主要干两件事:更新Layer 和 触发invalidate sf vsync请求,SurfaceFlinger::onMessageReceived接收invalidate sf vsync请求,然后主要执行两个方法:

  • handleMessageTransaction()
  • handleMessageInvalidate()

handleMessageTransaction() 核心方法在:handleTransaction ,主要针对Layer和Display的变化更新脏区域。

通过Layer的变化来计算脏区域,目的是需要更新我才刷新。

handleMessageInvalidate() 主要调用handlePageFlip()函数,该函数在systrace图上对应latchBuffer及其所包含的方法。作用主要是从各Layer对应的BufferQueue中拿图形缓冲区数据,并根据内容更新脏区域,并且把GraphicBuffer映射为OpenGL的texture 。

而它俩共同决定是否需要发送refresh sf vsync 请求,即signalRefresh()。

再看右边,即接收REFRESH消息:

从systrace看app冷启动过程(三)-首帧的合成与送显_第3张图片

主要执行方法handleMessageRefresh()合并和渲染输出。

void SurfaceFlinger::handleMessageRefresh() {
   ...
    preComposition(); //合成前的准备
    rebuildLayerStacks();//重建layer堆栈
    setUpHWComposer();//hwcomposer的设定
    doComposition();//正式的合成处理
    postComposition(refreshStartTime);//合成后期的处理
   ...
}

SurfaceFlinger::preComposition()
合成前再过一遍Layer是否被更新了,如果有则触发signalLayerUpdate(),通过EventThread安排一次invalidate sf vsync。

SurfaceFlinger::rebuildLayerStacks()
提取可见的Laye并计算可见区域,为合成准备好数据材料。

void SurfaceFlinger::setUpHWComposer()
决定由谁进行最终的合成工作,openGl or HWC。

void SurfaceFlinger::postComposition(refreshStartTime)
将图像传递到物理屏幕。但是在下一个vsync信号才被消费。

完成合成之后,releaseBuffer,这里释放的是之前latchBuffer 获取的GraphicsBuffer。

你可能感兴趣的:(从systrace看app冷启动过程(三)-首帧的合成与送显)