GUI系统之SurfaceFlinger(14)handleTransaction

本文详细解析了SurfaceFlinger的handleTransactionLocked函数,包括如何处理eTraversalNeeded和eTransactionNeeded两种情况。在traversal阶段遍历并处理各Layer的doTransaction,而在transaction阶段,SurfaceFlinger处理显示方向变化、新layer增加和layer移除等场景,影响可见区域计算。
摘要由CSDN通过智能技术生成
文章都是通过阅读源码分析出来的,还在不断完善与改进中,其中难免有些地方理解得不对,欢迎大家批评指正。
转载请注明:From LXS. http://blog.csdn.net/uiop78uiop78/

GUI系统之SurfaceFlinger章节目录:
blog.csdn.net/uiop78uiop78/article/details/8954508


1.1.1 handleTransaction

有两个相似的函数,handleTransaction需要获取mStateLock锁,执行handleTransactionLocked,最后再将mHwWorkListDirty置为true。

后一个handleTransactionLocked才是真正处理业务的地方。从前面我们对transactionflags的解释来推断,它的具体工作应该会分为两部分,即traversal(对应eTraversalNeeded)和transaction(对应eTransactionNeeded)。

void SurfaceFlinger::handleTransactionLocked(uint32_ttransactionFlags)

{

    const LayerVector&currentLayers(mCurrentState.layersSortedByZ);

    const size_t count =currentLayers.size();

 

    /*第一部分,traversal所有layer*/

    const boollayersNeedTransaction = transactionFlags & eTraversalNeeded;

    if (layersNeedTransaction){//是否需要traversal

        for (size_t i=0 ; i<count ; i++) {//逐个layer来处理

            constsp<LayerBase>& layer = currentLayers[i];

            uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);/*这个layer是否

                                                                    需要doTransaction*/

            if (!trFlags)continue;//如果不需要的话,直接进入下一个

 

            const uint32_tflags = layer->doTransaction(0);//由各layer做内部处理,下面会做详细分析

            if (flags &Layer::eVisibleRegion)//各layer计算可见区域是否变化

                mVisibleRegionsDirty = true;//可见区域发生变化

        }

    }

 

    /*第二部分,SurfaceFlinger执行transaction*/

    if (transactionFlags &eTransactionNeeded) {

       

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值