GUI系统之SurfaceFlinger(15)handlePageFlip

SurfaceFlinger的handlePageFlip处理图层翻页,涉及锁机制、可见区域计算、图层排序和虫洞计算。文章详细分析了lockPageFlip、computeVisibleRegions、解锁过程以及wormholeRegion的计算,揭示了Android系统中页面翻转的内部逻辑。
摘要由CSDN通过智能技术生成
文章都是通过阅读源码分析出来的,还在不断完善与改进中,其中难免有些地方理解得不对,欢迎大家批评指正。
转载请注明:From LXS. http://blog.csdn.net/uiop78uiop78/

GUI系统之SurfaceFlinger章节目录:

blog.csdn.net/uiop78uiop78/article/details/8954508


1.1.1 handlePageFlip

PageFlip可以理解为“翻页”。从这个意思上来看,它应该与图层缓冲区有关系——因为是多缓冲机制,在适当的时机,我们就需要做“翻页”的动作。

void SurfaceFlinger::handlePageFlip()

{…

    const DisplayHardware&hw = graphicPlane(0).displayHardware();//编号为0的Display

    const RegionscreenRegion(hw.bounds());//整个屏幕区域

const LayerVector&currentLayers(mDrawingState.layersSortedByZ);/*当前所有layers*/

 

const bool visibleRegions = lockPageFlip(currentLayers);/*Step1.下面会详细分析这个函数,注意它的返回

                                                值是一个bool类型变量。*/

        if (visibleRegions ||mVisibleRegionsDirty) {//可见区域发生变化

            RegionopaqueRegion;//不透明区域

            computeVisibleRegions(currentLayers, mDirtyRegion, opaqueRegion);/*Step2.计算可见区域*/

 

            /*Step3.重建mVisibleLayersSortedByZ,即所有可见图层的排序*/

            const size_t count= currentLayers.size();

            mVisibleLayersSortedByZ.clear();//清空

           mVisibleLayersSortedByZ.setCapacity(count);//容量

            for (size_t i=0 ;i<count ; i++) {

                if(!currentLayers[i]->visibleRegionScreen.isEmpty())//当前图层有可见区域

                   mVisibleLayersSortedByZ.add(currentLayers[i]);

            }

            mWormholeRegion = screenRegion.subtract(opaqueRegion);/*Step4.虫洞计算*/

           mVisibleRegionsDirty = false;

           invalidateHwcGeometry();

        }

    unlockPageFlip(currentLayers);/*Step5.与lockPageFlip相对应 */

    …

   mDirtyRegion.andSelf(screenRegion);//排除屏幕范围之外的区域

}

Step1@SurfaceFlinger::handlePageFlip,通过lockPageFlip分别锁定各layer当前要处理的缓冲区。SurfaceFlinger::lockPageFlip逻辑比较简单,我们直接来看下Layer::lockPageFlip:

void Layer::lockPageFlip(bool& recomputeVisibleRegions)

{…

    if (mQueuedFrames > 0) {…

        if(android_atomic_dec(&mQueuedFrames) > 1) {

            mFlinger->signalLayerUpdate();

        }

        …

        Rejectr(mDrawingState, currentState(), recomputeVisibleRegions);

        if (mSurfaceTexture->updateTexImage(&r) < NO_ERROR) {//加载新的纹理

           recomputeVisibleRegions = true;

            return;

        }

        mActiveBuffer = mSurfaceTexture->getCurrentBuffer();//当前活跃的缓冲区

        …//其它内部变量更新

        glTexParameterx(GL_TEXTURE_EXTERNAL_OES,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);//配置参数

        glTexParameterx(GL_TEXTURE_EXTERNAL_OES,GL_TEX

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值