一斟冕、SurfaceFlinger的原理
SurfaceFlinger
是Android系統(tǒng)中負(fù)責(zé)屏幕顯示內(nèi)容合成的服務(wù)豆挽,它接收來(lái)自多個(gè)應(yīng)用程序和系統(tǒng)服務(wù)的圖像緩沖區(qū)甲捏,根據(jù)它們的位置、大小以政、透明度霸褒、Z軸順序等屬性,將它們合成到一個(gè)最終的緩沖區(qū)中妙蔗,然后發(fā)送到顯示設(shè)備上傲霸。
二、SurfaceFlinger的作用
SurfaceFlinger
的作用是將所有的Surface和其他層合成到屏幕上眉反,形成最終的顯示效果。
Surface
是一個(gè)包含BufferQueue和SurfaceControl的對(duì)象
BufferQueue
是一個(gè)緩沖區(qū)隊(duì)列穆役,用于存儲(chǔ)圖像數(shù)據(jù)
SurfaceControl
是一個(gè)包含層元數(shù)據(jù)的對(duì)象寸五,用于控制Surface的顯示屬性。
Surface可以由應(yīng)用程序或者系統(tǒng)服務(wù)創(chuàng)建耿币,例如WindowManager梳杏、MediaServer、CameraService等。
SurfaceFlinger會(huì)根據(jù)Surface的屬性十性,將它們分為不同的類型叛溢,例如OVERLAY、SIDEBAND劲适、SOLID_COLOR楷掉、CLIENT等。
SurfaceFlinger會(huì)盡可能地將Surface標(biāo)記為OVERLAY類型霞势,表示可以直接將Surface的緩沖區(qū)合成到屏幕上烹植,而不需要經(jīng)過(guò)SurfaceFlinger的處理。
如果Surface不能被標(biāo)記為OVERLAY類型愕贡,那么它們就會(huì)被標(biāo)記為CLIENT類型草雕,表示需要由SurfaceFlinger來(lái)進(jìn)行合成。
除了Surface之外固以,SurfaceFlinger還會(huì)合成其他的層墩虹,例如BootAnimation、Framebuffer憨琳、ColorLayer等败晴。這些層的作用是顯示一些特殊的內(nèi)容,例如開(kāi)機(jī)動(dòng)畫栽渴、截屏尖坤、色彩校正等。
三闲擦、SurfaceFlinger的架構(gòu)
從上圖可以看出慢味,SurfaceFlinger的架構(gòu)主要包含以下幾個(gè)部分:
App和Service
:這些是Surface的創(chuàng)建者,它們可以通過(guò)SurfaceHolder或者SurfaceTexture等方式來(lái)創(chuàng)建和操作Surface墅冷,例如設(shè)置Surface的大小纯路、位置、透明度等屬性寞忿,或者向Surface的BufferQueue中提交圖像數(shù)據(jù)驰唬。Surface
:這是SurfaceFlinger的合成對(duì)象,它包含一個(gè)BufferQueue和一個(gè)SurfaceControl腔彰,BufferQueue用于存儲(chǔ)圖像數(shù)據(jù)叫编,SurfaceControl用于控制Surface的顯示屬性。
Surface在創(chuàng)建時(shí)霹抛,會(huì)向SurfaceFlinger注冊(cè)搓逾,讓SurfaceFlinger知道它的存在,并根據(jù)它的屬性來(lái)進(jìn)行合成杯拐。SurfaceFlinger
:這是屏幕顯示內(nèi)容合成的服務(wù)霞篡,它包含一個(gè)Looper線程和一個(gè)EventThread線程
Looper線程用于接收和處理來(lái)自Binder的消息世蔗,例如創(chuàng)建、銷毀朗兵、更新Surface等
EventThread線程用于接收和處理來(lái)自顯示設(shè)備的VSYNC信號(hào)污淋,VSYNC信號(hào)是一個(gè)垂直同步信號(hào),表示顯示設(shè)備可以接收新的緩沖區(qū)而不會(huì)產(chǎn)生撕裂現(xiàn)象余掖。
SurfaceFlinger會(huì)在收到VSYNC信號(hào)后寸爆,觸發(fā)一次合成操作。SurfaceFlinger還會(huì)與Hardware Composer進(jìn)行通信浊吏,詢問(wèn)應(yīng)該如何進(jìn)行合成而昨,Hardware Composer是一個(gè)硬件抽象層,用于利用硬件加速的方式來(lái)合成Surface找田,提高性能和節(jié)省電量歌憨。Hardware Composer
:這是一個(gè)硬件抽象層,用于利用硬件加速的方式來(lái)合成Surface墩衙,提高性能和節(jié)省電量务嫡。
Hardware Composer會(huì)根據(jù)Surface的屬性,將它們分為不同的類型漆改,例如OVERLAY心铃、SIDEBAND、SOLID_COLOR挫剑、CLIENT等去扣。
Hardware Composer會(huì)盡可能地將Surface標(biāo)記為OVERLAY類型,表示可以直接將Surface的緩沖區(qū)合成到屏幕上樊破,而不需要經(jīng)過(guò)SurfaceFlinger的處理愉棱。
如果Surface不能被標(biāo)記為OVERLAY類型,那么它們就會(huì)被標(biāo)記為CLIENT類型哲戚,表示需要由SurfaceFlinger來(lái)進(jìn)行合成奔滑。
Hardware Composer還會(huì)返回一個(gè)DisplayFrame,表示Surface在屏幕上的位置和大小顺少。
Hardware Composer會(huì)將合成后的緩沖區(qū)發(fā)送到顯示設(shè)備上朋其,完成繪制流程。Display
:這是顯示設(shè)備脆炎,用于展示合成后的緩沖區(qū)梅猿,形成最終的顯示效果。
Display會(huì)向SurfaceFlinger發(fā)送VSYNC信號(hào)腕窥,表示可以接收新的緩沖區(qū)而不會(huì)產(chǎn)生撕裂現(xiàn)象粒没。
Display還會(huì)向SurfaceFlinger反饋一些信息,例如顯示設(shè)備的分辨率簇爆、刷新率癞松、色彩空間等。
四入蛆、SurfaceFlinger的啟動(dòng)流程
從上圖可以看出响蓉,SurfaceFlinger的啟動(dòng)過(guò)程主要包含以下幾個(gè)步驟:
-
init
:這是Android系統(tǒng)的初始化進(jìn)程,它負(fù)責(zé)啟動(dòng)各種系統(tǒng)服務(wù)哨毁,包括SurfaceFlinger枫甲。init會(huì)讀取init.rc文件,根據(jù)其中的配置扼褪,啟動(dòng)SurfaceFlinger進(jìn)程想幻,并傳遞一些參數(shù),例如日志級(jí)別话浇、調(diào)試選項(xiàng)等脏毯。 -
SurfaceFlinger
:這是屏幕顯示內(nèi)容合成的服務(wù),它是一個(gè)獨(dú)立的進(jìn)程幔崖,由init啟動(dòng)食店。SurfaceFlinger會(huì)執(zhí)行main()函數(shù),該函數(shù)是SurfaceFlinger的入口函數(shù)赏寇,它會(huì)調(diào)用initSurfaceFlinger()函數(shù)吉嫩,該函數(shù)是SurfaceFlinger的初始化函數(shù),它會(huì)完成SurfaceFlinger的各種初始化工作嗅定。 -
main()
:這是SurfaceFlinger的入口函數(shù)自娩,它會(huì)調(diào)用initSurfaceFlinger()函數(shù),該函數(shù)是SurfaceFlinger的初始化函數(shù)渠退,它會(huì)完成SurfaceFlinger的各種初始化工作忙迁。
initSurfaceFlinger():這是SurfaceFlinger的初始化函數(shù),它會(huì)完成SurfaceFlinger的各種初始化工作智什,包括以下幾個(gè)方面:
- 創(chuàng)建一個(gè)Looper線程动漾,用于接收和處理來(lái)自Binder的消息,例如創(chuàng)建荠锭、銷毀旱眯、更新Surface等。
- 創(chuàng)建一個(gè)EventThread線程证九,用于接收和處理來(lái)自顯示設(shè)備的VSYNC信號(hào)删豺,VSYNC信號(hào)是一個(gè)垂直同步信號(hào),表示顯示設(shè)備可以接收新的緩沖區(qū)而不會(huì)產(chǎn)生撕裂現(xiàn)象愧怜。SurfaceFlinger會(huì)在收到VSYNC信號(hào)后呀页,觸發(fā)一次合成操作。
- 初始化Hardware Composer拥坛,Hardware Composer是一個(gè)硬件抽象層蓬蝶,用于利用硬件加速的方式來(lái)合成Surface尘分,提高性能和節(jié)省電量。SurfaceFlinger會(huì)與Hardware Composer進(jìn)行通信丸氛,詢問(wèn)應(yīng)該如何進(jìn)行合成培愁,Hardware Composer會(huì)根據(jù)Surface的屬性,將它們分為不同的類型缓窜,例如OVERLAY定续、SIDEBAND、SOLID_COLOR禾锤、CLIENT等私股。Hardware Composer會(huì)盡可能地將Surface標(biāo)記為OVERLAY類型,表示可以直接將Surface的緩沖區(qū)合成到屏幕上恩掷,而不需要經(jīng)過(guò)SurfaceFlinger的處理倡鲸。如果Surface不能被標(biāo)記為OVERLAY類型,那么它們就會(huì)被標(biāo)記為CLIENT類型螃成,表示需要由SurfaceFlinger來(lái)進(jìn)行合成旦签。Hardware Composer還會(huì)返回一個(gè)DisplayFrame,表示Surface在屏幕上的位置和大小寸宏。
- 獲取顯示設(shè)備的信息宁炫,例如顯示設(shè)備的分辨率、刷新率氮凝、色彩空間等羔巢。SurfaceFlinger會(huì)根據(jù)這些信息,來(lái)設(shè)置Surface的大小罩阵、位置竿秆、格式等屬性,以適應(yīng)顯示設(shè)備的特性稿壁。SurfaceFlinger還會(huì)向顯示設(shè)備注冊(cè)一個(gè)回調(diào)函數(shù)幽钢,用于接收顯示設(shè)備的狀態(tài)變化,例如連接傅是、斷開(kāi)匪燕、旋轉(zhuǎn)等。