Android圖形系統分析與移植–四、Surface Manager(Surface Flinger簡介)

來源:互聯網
上載者:User

Surface Manager是使用者空間中framework下libraries中負責顯示相關的一個模組,當系統同時執行多個應用程式時,SurfaceManager會負責管理顯示與存取操作間的互動,另外也負責將2D繪圖與3D繪圖進行顯示上的合成。

1、Surface manager架構分析

Android中的圖形系統採用Client/Server架構,如下:

Client端:應用程式相關部分。代碼分為兩部分,一部分是由Java提供的供應用使用的api,另一部分則是由c++寫成的底層實現。

Server端:即SurfaceFlinger,負責合成並送入buffer顯示。其主要由c++代碼編寫而成。

Client和Server之前通過Binder的IPC方式進行通訊,總體結構圖1所示:

如所示,Surface的client部分其實是提供給各應用程式進行畫圖操作的一個橋樑,該橋樑通過binder通向server端的Surfaceflinger,Surfaceflinger負責合成各個surface,然後把buffer傳送到FrameBuffer端進行底層顯示。其中每個surface對應2個buffer,一個frontbuffer, 一個back buffer,更新時,資料更新在back buffer上,需要顯示時,則將back buffer和front buffer互換。

下面我們來重點研究一下Surface Flinger。

2、Surface Flinger

SurfaceFinger按英文翻譯過來就是Surface投遞者。SufaceFlinger的構成並不是太複雜,複雜的是他的用戶端建構。SufaceFlinger主要功能是:

1) 將Layers (Surfaces) 內容的重新整理到螢幕上。

2) 維持Layer的Zorder序列,並對Layer最終輸出做出裁剪計算。

3) 響應Client要求,建立Layer與用戶端的Surface建立串連。

4) 接收Client要求,修改Layer屬性(輸出大小,Alpha等設定)。

但是作為投遞者的實際意義,我們首先需要知道的是如何投遞,投擲物,投遞路線,投遞目的地。

3、Surface Flinger的基本組成架構

Surface Flinger的基本組成架構如所示

SurfaceFlinger管理對象為:

1)       mClientsMap:管理用戶端與服務端的串連。

2)       ISurface,IsurfaceComposer:AIDL調用介面執行個體

3)       mLayerMap:服務端的Surface的管理對象。

4)       mCurrentState.layersSortedByZ :以Surface的Z-order序列排列的Layer數組。

5)       graphicPlane 緩衝區輸出管理

6)       OpenGL ES:圖形計算,映像合成等圖形庫。

7)       gralloc.xxx.so這是個跟平台相關的圖形緩衝區管理器,是FB的硬體抽象層。

8)       pmem Device,FB Device:提供共用記憶體,在這裡只是在gralloc.xxx.so可見,在上層被gralloc.xxx.so抽象了。

4、SurfaceFlinger與FrameBuffer

首先SurfaceFlinger需要操作到螢幕,需要建立一個螢幕硬體緩衝區管理架構。Android在設計支援時,考慮多個螢幕的情況,引入了graphicPlane的概念。在SurfaceFlinger上有一個graphicPlane數組,每一個graphicPlane對象都對應一個DisplayHardware.在當前的Android(2.1)版本的設計中,系統支援一個graphicPlane,所以也就支援一個DisplayHardware。

SurfaceFlinger,Hardware硬體緩衝區的資料結構關係圖:

5、 SurfaceFlinger的運行架構

SurfaceFlinger的運行架構存在於threadLoop,他是SurfaceFlinger的主迴圈體。threadLoop流程圖:

1.                  handleTransaction(…)

主要計算每個Layer有無屬性修改,如果有修改著內用需要重畫。

2.                  handlePageFlip()

computeVisibleRegions:根據Z-Order序列計算每個Layer的可見地區和被覆蓋地區。裁剪輸出範圍計算-

在產生裁剪地區的時候,根據Z_order依次,每個Layer在計算自己在螢幕的可顯示地區時,需要經曆如下步驟:

1)以自己的W,H給出自己初始的可見地區

2)減去自己上面視窗所覆蓋的地區

3)在繪製時,Layer將根據自己的可見地區做相應的地區資料複製

過程:

3.                  handleRepaint()

composeSurfaces(需要重新整理地區)

根據每個Layer的可見地區與需要重新整理地區的交集地區從Z-Order序列從底部開始繪製到主Surface上。

4.                  postFramebuffer()

該介面在Threadloop中被調用,負責將合成好的資料(存於back buffer中)推入在front buffer中,然後調用HAL介面命令底層顯示。

現在將SurfaceFlinger乾的事情用下面的總結一下:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.