GUI(Graphic User Interface)即“圖形用戶界面”。Android 的 GUI 系統(tǒng)是基于 OpenGL/EGL 實(shí)現(xiàn)的。
9.4 Android中的本地窗口
- 面向管理者(SurfaceFlinger),本地窗口是 FramebufferNativeWindow。
- 面向應(yīng)用程序,本地窗口是 Surface。
FramebufferNativeWindow 是專(zhuān)門(mén)為 SurfaceFlinger 服務(wù)的,由 Gralloc 提供支持。Surface 是為應(yīng)用程序服務(wù)的,本質(zhì)上還是由 SurfaceFlinger 服務(wù)統(tǒng)一管理,涉及很多跨進(jìn)程通信細(xì)節(jié)。
9.5 BufferQueue詳解
一塊 Buffer 在處理過(guò)程中經(jīng)歷的生命周期依次是 FREE->DEQUEUED->QUEUED->ACQUIRED->FREE。
參與 Buffer 管理的 Owner 對(duì)象有3個(gè):
- BufferQueue
BufferQueue 是一個(gè)服務(wù)中心,其他兩個(gè) Owner 必須通過(guò)它管理 Buffer。
- Producer
生產(chǎn)者就是“填充” Buffer 數(shù)據(jù)的人,通常情況下當(dāng)然是應(yīng)用程序。因?yàn)楫?dāng)應(yīng)用程序不斷地刷新UI,從而將產(chǎn)生的顯示數(shù)據(jù)源源不絕地寫(xiě)到 Buffer 中。當(dāng) Producer 需要使用一塊 Buffer 時(shí),它首先會(huì)向中介 BufferQueue 發(fā)起 dequeue 申請(qǐng),然后才能對(duì)指定的緩沖區(qū)進(jìn)行操作。當(dāng) Producer 認(rèn)為一塊 Buffer 已經(jīng)寫(xiě)入完成后,將調(diào)用 BufferQueue 的 queue 接口,把 Buffer 歸還到 BufferQueue 隊(duì)列中。
- Consumer
消費(fèi)者與生產(chǎn)者是相對(duì)應(yīng)的,它的操作同樣受到 BufferQueue 的管控。當(dāng)一塊 Buffer 已經(jīng)就緒后,Consumer 就可以開(kāi)始工作了。
小結(jié):
- 應(yīng)用程序可以調(diào)用 createSurface 來(lái)建立多個(gè) Layer,它們是一對(duì)多的關(guān)系。
- 每個(gè) Layer 對(duì)應(yīng)一個(gè) BufferQueue。
9.6 SurfaceFlinger
一個(gè)典型的顯示器有兩個(gè)重要特性,即“行頻和場(chǎng)頻”。行頻又稱為“水平掃描頻率”,是屏幕每秒鐘從左至右掃描的次數(shù);場(chǎng)頻又稱為“垂直掃描頻率”,是每秒鐘整個(gè)屏幕刷新的次數(shù)。
當(dāng)掃描完一個(gè)屏幕后,設(shè)備需要重新回到第一行以進(jìn)行下一輪的循環(huán),此時(shí)有一段時(shí)間空隙,稱為 Vertical Blanking Interval(VBI)。這個(gè)時(shí)間點(diǎn)就是進(jìn)行緩沖區(qū)交換的最佳時(shí)間,因?yàn)榇藭r(shí)屏幕沒(méi)有在刷新。Vsync(垂直同步)是 Vertical Synchronization 的簡(jiǎn)寫(xiě),它利用 VBI 時(shí)期出現(xiàn)的 Vertical Sync Pulse 來(lái)保證雙緩沖能在最佳時(shí)間點(diǎn)進(jìn)行交換。
大部分 Android 顯示設(shè)備刷新頻率是60Hz,這也就意味著每一幀最多只能留給系統(tǒng)1/60=16ms左右的準(zhǔn)備時(shí)間。
Triple Buffering 是 Mutiple Buffering 的一種,指的是系統(tǒng)使用3個(gè)緩沖區(qū)用于顯示工作。
接口的服務(wù)端 -- Client
SurfaceFlinger 運(yùn)行于 SystemServer 進(jìn)程中,需要顯示UI界面的應(yīng)用程序通過(guò) Binder 服務(wù)與它進(jìn)行跨進(jìn)程通信。每個(gè)應(yīng)用程序在 SurfaceFlinger 中都有 Client 對(duì)象為其提供服務(wù),應(yīng)用程序與 Client 間的 Binder 接口是 ISurfaceComposerClient。
9.7 Vsync 的產(chǎn)生和處理
Android 源碼工程 surfaceflinger 目錄下有一個(gè) displayhardware 文件夾,其中 HWComposer 的主要職責(zé)之一,就是用于產(chǎn)生 Vsync 信號(hào)。Vsync 信號(hào)可由硬件實(shí)現(xiàn)或者軟件模擬。