Surface Manager是用戶空間中framework下libraries中負責顯示相關的一個模塊,當系統同時執行多個應用程序時,SurfaceManager會負責管理顯示與存取操做間的互動,另外也負責將2D繪圖與3D繪圖進行顯示上的合成。c++
一、Surface manager架構分析api
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互換。oop
下面咱們來重點研究一下Surface Flinger。post
二、Surface Flinger
SurfaceFinger按英文翻譯過來就是Surface投遞者。SufaceFlinger的構成並非太複雜,複雜的是他的客戶端建構。SufaceFlinger主要功能是:翻譯
1) 將Layers (Surfaces) 內容的刷新到屏幕上。設計
2) 維持Layer的Zorder序列,並對Layer最終輸出作出裁剪計算。
3) 響應Client要求,建立Layer與客戶端的Surface創建鏈接。
4) 接收Client要求,修改Layer屬性(輸出大小,Alpha等設定)。
可是做爲投遞者的實際意義,咱們首先須要知道的是如何投遞,投擲物,投遞路線,投遞目的地。
三、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抽象了。
四、SurfaceFlinger與FrameBuffer
首先SurfaceFlinger須要操做到屏幕,須要創建一個屏幕硬件緩衝區管理框架。Android在設計支持時,考慮多個屏幕的狀況,引入了graphicPlane的概念。在SurfaceFlinger上有一個graphicPlane數組,每個graphicPlane對象都對應一個DisplayHardware.在當前的Android(2.1)版本的設計中,系統支持一個graphicPlane,因此也就支持一個DisplayHardware。
SurfaceFlinger,Hardware硬件緩衝區的數據結構關係圖:
五、 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乾的事情用下面的示意圖總結一下: