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乾的事情用下面的總結一下: