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

Android GUI系統之SurfaceFlinger(18) postFramebuffer

編輯:Android開發教程

1.1.1 postFramebuffer

在多緩沖區機制中,只有把顯示數據寫入framebuffer才能真正在物理屏幕上顯示。前面幾個小節的輸出都是backbuffers,我們還需要最後一步——postFramebuffer。

void SurfaceFlinger::postFramebuffer()

{…    

   const DisplayHardware&hw(graphicPlane(0).displayHardware());

   …

   hw.flip(mSwapRegion);//交換前後台buffer

   size_t numLayers =mVisibleLayersSortedByZ.size();

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

      mVisibleLayersSortedByZ[i]->onLayerDisplayed();

   }

   …

}

先從opengl本地窗口的角度來想一下:

queueBuffer

一旦“生產者”完成生產後,它需要把當前的buffer重新入隊,以使“消費者”可以做接下來的處理

dequeueBuffer

為了“生產者”可以繼續下一輪的工作,它會重新deque

基本的思路就是這樣子,不過Android系統將一些步驟封裝到了DisplayHardware中,我們稍後會看到。

DisplayHardware::flip完成後,分別通知各可見Layer它們的內容已經顯示出來了。

void DisplayHardware::flip(const Region& dirty) const

{…

   mPageFlipCount++;//flip計數

   if (mHwc->initCheck()== NO_ERROR) {

       mHwc->commit();

   } else {

       eglSwapBuffers(dpy, surface);

   }

   …

}

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