SurfaceFlinger的原理

一斟冕、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)示意圖

從上圖可以看出慢味,SurfaceFlinger的架構(gòu)主要包含以下幾個(gè)部分:

  1. App和Service:這些是Surface的創(chuàng)建者,它們可以通過(guò)SurfaceHolder或者SurfaceTexture等方式來(lái)創(chuàng)建和操作Surface墅冷,例如設(shè)置Surface的大小纯路、位置、透明度等屬性寞忿,或者向Surface的BufferQueue中提交圖像數(shù)據(jù)驰唬。

  2. 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)行合成杯拐。

  3. 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é)省電量歌憨。

  4. 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è)備上朋其,完成繪制流程。

  5. 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ò)程示意圖

從上圖可以看出响蓉,SurfaceFlinger的啟動(dòng)過(guò)程主要包含以下幾個(gè)步驟:

  1. 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)等脏毯。
  2. 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的各種初始化工作嗅定。
  3. 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)等。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喧笔,一起剝皮案震驚了整個(gè)濱河市帽驯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌书闸,老刑警劉巖尼变,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異浆劲,居然都是意外死亡嫌术,警方通過(guò)查閱死者的電腦和手機(jī)哀澈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蛉威,“玉大人日丹,你說(shuō)我怎么就攤上這事走哺◎窍樱” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵丙躏,是天一觀的道長(zhǎng)择示。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晒旅,這世上最難降的妖魔是什么栅盲? 我笑而不...
    開(kāi)封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮废恋,結(jié)果婚禮上谈秫,老公的妹妹穿的比我還像新娘。我一直安慰自己鱼鼓,他們只是感情好拟烫,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著迄本,像睡著了一般硕淑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘉赎,一...
    開(kāi)封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天置媳,我揣著相機(jī)與錄音,去河邊找鬼公条。 笑死拇囊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靶橱。 我是一名探鬼主播寥袭,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼抓韩!你這毒婦竟也來(lái)了纠永?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谒拴,失蹤者是張志新(化名)和其女友劉穎尝江,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體英上,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炭序,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年啤覆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惭聂。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窗声,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辜纲,到底是詐尸還是另有隱情笨觅,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布耕腾,位于F島的核電站见剩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扫俺。R本人自食惡果不足惜苍苞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狼纬。 院中可真熱鬧羹呵,春花似錦、人聲如沸疗琉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)没炒。三九已至涛癌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間送火,已是汗流浹背拳话。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留种吸,地道東北人弃衍。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像坚俗,于是被迫代替她去往敵國(guó)和親镜盯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容