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

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

相關文章
相關標籤/搜索