接上篇,RenderThread完成了渲染,最终通过queueBuffer把保存了数据的buffer扔给SurfaceFlinger等待合成。
queueBuffer是一个binder call(默认surfaceFlinger binder线程数为4),对端是SurfaceFlinger,如下图所示:
之前介绍过,SurfaceFlinger初始化好之后,主线程run方法会执行MessageQueue.cpp中的waitForEvent等待接收消息。
一旦有视图变化就会发起invalidate vsync请求,waitForEvent稍后会接收到对应invalidate消息进行处理,正常情况下surfaceFlinger处理消息间隔保持在16.6ms之间,而queueBuffer过程本身就会发起invalidate vsync请求。
接着看接收到数据的处理:
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消息:
主要执行方法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。