Android GUI系统之SurfaceFlinger(14) handleTransaction

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) {

       if (mCurrentState.orientation != mDrawingState.orientation) {

           /*角度产生变化,需要重新计算所有的可见区域,并且重绘*/

           const int dpy = 0;//第一个Display

           const intorientation = mCurrentState.orientation; //新的orientation

           GraphicPlane&plane(graphicPlane(dpy));

          plane.setOrientation(orientation);//将改变后的旋转角度设置到底层管理者

           // update theshared control block

           constDisplayHardware& hw(plane.displayHardware());

            /*下面的dcblk是一个供应用程序查询当前显示属性的“服务机构”,因而需要同步更新它*/

           volatiledisplay_cblk_t* dcblk = mServerCblk->displays + dpy;

          dcblk->orientation = orientation;

           dcblk->w =plane.getWidth();

           dcblk->h =plane.getHeight();

           mVisibleRegionsDirty= true; //旋转角度变化,当然可见区域也会变化

          mDirtyRegion.set(hw.bounds());//整个屏幕区域都是“脏”的

       }

       if (currentLayers.size() > mDrawingState.layersSortedByZ.size()) {// 有新的layer增加            

          mVisibleRegionsDirty = true;//可见区域需要重新计算

       }

       if (mLayersRemoved) {/*也可能有layers已经被移除,这样可见区域也会有变化。

                            比如原本被遮盖的部分或许就暴露出来了*/

           mLayersRemoved =false; //

          mVisibleRegionsDirty = true;

           constLayerVector& previousLayers(mDrawingState.layersSortedByZ);

           const size_t count= previousLayers.size();

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

               constsp<LayerBase>& layer(previousLayers[i]);

               if(currentLayers.indexOf( layer ) < 0) {/*在之前状态中存在,在现有状态中找不到,

                                                说明它被removed了*/

                  mDirtyRegionRemovedLayer.orSelf(layer->visibleRegionScreen);/*被移除layer的可见

                                                                          区域*/

               }

           }

       }

   }

   commitTransaction();//和Layer::doTransaction()的做法基本一样,多了几步操作

}

时间: 2024-12-30 05:20:54

Android GUI系统之SurfaceFlinger(14) handleTransaction的相关文章

Android GUI系统之SurfaceFlinger(1)OpenGLES与EGL

第1章  GUI系统之SurfaceFlinger 在进入GUI系统的学习前,建议大家可以先阅读本书应用篇中的"OpenGLES"章节,并参阅OpenGL ES官方指南.因为Android的GUI系统是基于OpenGL/EGL来实现的,如果没有一定基础的话,分析源码时有可能会"事倍功半". 1.1 OpenGLES与EGL SurfaceFlinger虽然是GUI的核心,但相对于OpenGL ES来讲,它其实只是一个"应用". 对于没有做过Ope

Android GUI系统之SurfaceFlinger(11) SurfaceComposerClient

1.1.1 SurfaceComposerClient 图 11?28 每个应用程序在SurfaceFlinger中都对应一个Client SurfaceFlinger运行于SystemServer这一系统进程中,需要UI界面显示的应用程序则通过binder服务与它进行跨进程通信.在音频系统的学习中,每一个AudioTrack在AudioFlinger中都可以找到一个对应的Track实现.这种设计方式同样适用于显示系统,即任何有UI界面的程序都在SurfaceFlinger中有且仅有一个Clie

Android GUI系统之SurfaceFlinger(7) 应用程序的典型绘图流程

1.1.1 应用程序的典型绘图流程 我们知道,BufferQueue有最多达32个BufferSlot,这样设计的目的是什么?一个可能的原因就是提高图形渲染速度.因为假如只有两个buffer,可以想象一下,当应用程序这个生产者的产出效率大于消费者的处理速度时,很快它就会dequeue完所有缓冲区而处于等待状态,从而导致不必要的麻烦.当然,实际上32只是最大的容量,具体值是可以设置的,大家可以结合后面的ProjectButter小节来理解一下. 前面小节我们已经学习了BufferQueue的内部原

Android GUI系统之SurfaceFlinger(4)

opengl es本地窗口SurfaceTextureClient 1.1.1 SurfaceTextureClient 针对应用程序端的本地窗口是SurfaceTextureClient,和FramebufferNativeWindow一样,它必须继承ANativeWindow: class SurfaceTextureClient    : publicANativeObjectBase<ANativeWindow, SurfaceTextureClient,RefBase> 这个本地窗口

Android GUI系统之SurfaceFlinger(3)

Android中的本地窗口FramebufferNativewindow  1.1 Android中的本地窗口 在OpenGL的学习过程中,我们不断提及"本地窗口"(NativeWindow)这一概念.那么对于Android系统来说,它是如何将OpenGL ES本地化的呢,或者说,它提供了什么样的本地窗口? 根据整个Android系统的GUI设计理念,我们不难猜想到至少需要两种本地窗口: 面向管理者(SurfaceFlinger) 既然SurfaceFlinger扮演了系统中所有UI界

Android GUI系统之SurfaceFlinger(18) postFramebuffer

1.1.1 postFramebuffer 在多缓冲区机制中,只有把显示数据写入framebuffer才能真正在物理屏幕上显示.前面几个小节的输出都是backbuffers,我们还需要最后一步--postFramebuffer. void SurfaceFlinger::postFramebuffer() {-        const DisplayHardware&hw(graphicPlane(0).displayHardware());    -    hw.flip(mSwapRegi

Android GUI系统之SurfaceFlinger(17) handleRepaint

1.1.1 handleRepaint 经过handleTransaction和handlePageFlip等步骤的准备工作后,现在可以合成各图层数据了. void SurfaceFlinger::handleRepaint() {- mSwapRegion.orSelf(mDirtyRegion);    const DisplayHardware&hw(graphicPlane(0).displayHardware());    -    uint32_t flags =hw.getFlag

Android GUI系统之SurfaceFlinger(12) VSync信号的产生和处理

1.1 VSync的产生和处理 前面小节ProjectButter中我们学习了Android 4.1显示系统中的新特性,其中一个就是加入了VSync同步.我们从理论的角度分析了采用这一机制的必要性和运作机理,那么SurfaceFlinger具体是如何实施的呢? 先来想一下有哪些东西要考虑: · VSync信号的产生和分发 如果有硬件主动发出这一信号,那是最好的了;否则就得通过软件定时模拟来产生 · VSync信号的处理 当信号产生后,SurfaceFlinger如何在最短的时间内响应,具体处理流

Android GUI系统之SurfaceFlinger(9) Project Butter黄油计划

1.1 SurfaceFlinger 从这一小节开始,我们正式切入SurfaceFlinger的分析.为了保持讲解的连贯性,部分内容可能在前面的章节中已经有所涉及了,接下来将会对其中的细节做更多的扩展讲解. 内容组织如下: l  首先介绍Android 4.1引入的新特性(Project Butter),理解这个项目是必要的,可以说SurfaceFlinger有很大一部分的内容就是围绕它来的 l  SurfaceFlinger的启动过程及工作方式 l  SurfaceFlinger与Buffer