第9章 SurfaceFlinger

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)或者軟件模擬。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容