Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android GUI系統之SurfaceFlinger(14) handleTransaction

Android GUI系統之SurfaceFlinger(14) handleTransaction

編輯:Android開發教程

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()的做法基本一樣,多了幾步操作

}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved