目錄
- 一、顯示整體架構
- 二、SurfaceFlinger
- 三、HWC
- 四、Gralloc
- 五、DisplayManagerService
- 六、WindowManagerService
一、顯示整體架構
二、SurfaceFlinger
SurfaceFlinger是一個系統服務,如:audioflinger等等,這個系統服務主要實現了Surface的建立、控制、管理等功能。換種說法就是,在Android 的實現中它是一個service,提供系統范圍內的surface composer功能,它能夠將各種應用程序的2D、3D surface進行組合。
SurfaceFlinger是整個Android系統渲染的核心進程。所有應用的渲染邏輯最終都會來到SF中進行處理,最終會把處理后的圖像數據交給CPU或者GPU進行繪制,在每一個應用中都以Surface作為一個圖元傳遞單元,向SF這個服務端傳遞圖元數據。
目前SurfaceFlinger中支持兩種合成方式,一種是Device合成,一種是Client合成。SurfaceFlinger 在收集可見層的所有緩沖區之后,便會詢問Hardware Composer應如何進行合成。
- 1、Device合成
Device合成方式是相對與硬件合成來說的,其合成方式是,將各個Layer的內容用GPU渲染到暫存緩沖區中,最后將暫存緩沖區傳送到顯示硬件。這個暫存緩沖區,我們稱為FBTarget,每個Display設備有各自的FBTarget。Device合成,之前稱為GLES合成,我們也可以稱之為GPU合成。Device合成,采用RenderEngine進行合成。 - 2、Client合成
Client合成就是用專門的硬件合成器進行合成HWComposer,所以硬件合成的能力就取決于硬件的實現。其合成方式是將各個Layer的數據全部傳給顯示硬件,并告知它從不同的緩沖區讀取屏幕不同部分的數據。
三、HWC
HWC是Android中進行窗口合成和顯示的HAL層模塊,通常是由OEM實現并完成,為SurfaceFlinger提供硬件支持。
SurfaceFlinger可以使用OpenGL ES合成Layer,這需要占用并消耗GPU資源。大多數GPU都沒有針對圖層合成進行優化,因此當SurfaceFlinger通過GPU合成圖層時,應用程序無法使用GPU進行自己的渲染。而HWC通過硬件設備進行圖層合成,可以減輕GPU的合成壓力
HWC合成機制:
- SurfaceFlinger向HWC提供所有Layer的完整列表,讓HWC根據其硬件能力,決定如何處理這些Layer
- HWC會為每個Layer標注合成方式,表明是通過GPU還是通過HWC合成
- SurfaceFlinger負責先把所有注明GPU合成的Layer合成到一個輸出Buffer,然后把這個輸出Buffer和其他Layer(注明HWC合成的Layer)一起交給HWC,讓HWC完成剩余Layer的合成和顯示
四、Gralloc
在android中,HAL層的gralloc庫負責申請圖形緩沖區的所有工作,HAL層之上的Surface、BufferQueue最終都是調用gralloc庫去申請圖形緩沖區,然后返回給上層一個buffer_handle_t
gralloc分配framebuff圖形緩沖區
gralloc調用gralloc_alloc_framebuffer()分配framebuffer的內存,其核心是對fb設備/dev/graphics/fb或者/dev/fb執行mmap(),映射到用戶空間
gralloc分配普通圖形緩沖區
普通圖形緩沖去則是通過gralloc_alloc_buffer()分配內存的
五、DisplayManagerService
DisplayManagerServices主要是用來管理顯示的生命周期,它決定如何根據當前連接的物理顯示設備控制其邏輯顯示,并且在狀態更改時,向系統和應用程序發送通知。
默認支持4種顯示類型:
- LocalDisaplay:本地物理屏幕顯示設備,DMS啟動之后通過SurfaceFlinger獲取物理屏數據
- OverlayDisplay: 模擬輔助顯示設備, 開發者選項->模擬輔助顯示
- WIFIDisplay: 無線連接顯示設備, Wifi連接顯示的物理屏幕
- VirtualDisplay: 虛擬顯示設備,如VR ,屏幕錄制
提供上層訪問的主要接口:
- public Display[ ] getDisplays():獲取當前所有有效的logic display列表
- public Display getDisplay(int displayId):根據displayId獲取logic display的信息
- public void registerDisplayListener(DisplayListener listener, Handler handler):
注冊顯示器監聽事件,用來監聽顯示器的新增,刪除,變更等事件 - public void unregisterDisplayListener(DisplayListener listener):
取消顯示器監聽事件
六、WindowManagerService
WindowManagerService是WindowManager的管理者,負責窗口的啟動、添加和刪除,WindowManager會監控窗口的生命周期、輸入事件、屏幕方向、旋轉、動畫、位置等多種狀態,同時會將所有窗口的元數據發送給SurfaceFlinger,SurfaceFlinger使用這些數據在屏幕上合成Surface。