Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android GUI系統之SurfaceFlinger(8) 應用程序與BufferQueue的關系

Android GUI系統之SurfaceFlinger(8) 應用程序與BufferQueue的關系

編輯:Android開發教程

1.1.1 應用程序與BufferQueue的關系

接著上一小節未解決完的問題繼續講解。

現在我們已經明白了應用程序利用SurfaceFlinger進行繪制工作的大致流程了,只不過在這個過程中直到最後才出現了BufferQueue。應用程序具體是如何借助BufferQueue來完成工作的呢?

仔細觀察不難發現,當應用端通過ISurfaceComposerClient::createSurface()來發起創建Surface的請求時,SurfaceFlinger服務進程這邊會創建一個Layer。既然Layer代表了一個畫面圖層,那麼它肯定需要有存儲圖層數據的地方,因而我們選擇從這裡做為入口。

/*frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp*/

/*應用程序首先是要通過ISurfaceComposerClient來訪問createSurface,這個接口實際上只是一個中介,它將應用的請求傳送到SurfaceFlinger的消息隊列中,而不是直接調用SurfaceFlinger來處理。這樣做是有必要的,因為一個系統中需要SurfaceFlinger處理的來自各應用程序的消息是很多的,除非一些緊急情況,否則都應該排隊等待*/

sp<ISurface>SurfaceFlinger::createSurface(ISurfaceComposerClient::surface_data_t* params,

constString8& name, const sp<Client>& client, DisplayID d,

uint32_tw, uint32_t h, PixelFormat format, uint32_t flags)

{

   sp<LayerBaseClient>layer;

   sp<ISurface>surfaceHandle;

   …

   sp<Layer>normalLayer;

   switch (flags &eFXSurfaceMask) { //Layer類型

       case eFXSurfaceNormal:

           normalLayer = createNormalSurface(client, d, w, h, flags, format);

           layer =normalLayer;

           break;

       case eFXSurfaceBlur://4.1系統中將Blur與Dim類型當成一種

       case eFXSurfaceDim:

           layer = createDimSurface(client, d, w, h, flags);

           break;

       case eFXSurfaceScreenshot:

           layer = createScreenshotSurface(client, d, w, h, flags);

           break;

   }

   if (layer != 0) {…      

       surfaceHandle = layer->getSurface();

       …

   }

   return surfaceHandle;

}

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