前言
很多人都聽過SurfaceFlinger,但是不清楚Surfaceflinger到底是一個什么東西,我接下來用直白的語言講述一下SurfaceFlinger,這里更多的討論是大體框架,而不是代碼,我一直覺得首先看懂框架,才能去猜測寫代碼的人寫什么東西。
SurfaceFlinger = Surface + Flinger
SurfaceFlinger是一個特殊進(jìn)程,主要負(fù)責(zé)合成所有Surface到Framebuffer,然后屏幕去讀取這個Framebuffer,然后顯示給用戶看。
舉個栗子
王老師每天要完成一幅美術(shù)作品,美術(shù)作品包含三個部分,一個房子,一條小河,一座山,他手下有三個學(xué)生A,B,C,王老師給了一個空白的貼紙給A讓他去畫一個房子,給了一個空白的貼紙給B讓他去畫一條河,給了一個空白的貼紙給C讓他去畫一座山。并且通知他們每天12點(diǎn)準(zhǔn)時上交貼紙,然后由王老師臨摹三個貼紙上房子,小河,山到了一張固定尺寸的白紙上,每天將當(dāng)天畫的美術(shù)作品給美術(shù)館,讓其展覽。
故事中的角色在Android手機(jī)中代表什么
學(xué)生A,B,C
學(xué)生A,B,C對應(yīng)到Android系統(tǒng)上就是Activity,懸浮窗口,壁紙,導(dǎo)航欄,通知欄。我們可以簡稱一個Window
空白的貼紙
空白的貼紙代表一個Surface,代表一塊可以通過OpenGL或者skia的方式進(jìn)行繪制的buffer,就是一個內(nèi)存,或者理解為一個bitmap
每天12點(diǎn)
每天12點(diǎn)就是Vsync信號,所有繪制和合成的時間點(diǎn),手機(jī)里一般是16毫秒一次,因?yàn)槭謾C(jī)的幀率是60hz
美術(shù)作品
美術(shù)作品就是FrameBuffer,一塊內(nèi)存
王老師
王老師就是SurfaceFlinger,負(fù)責(zé)用OpenGL的將所有的Surface重新繪制到FrameBuffer
美術(shù)館
美術(shù)館就是手機(jī)屏幕,每天展示SurfaceFlinger準(zhǔn)備好的FrameBuffer
看下面一個圖

深入思考一個問題
如何實(shí)現(xiàn)錘子手機(jī)到TNT上,類似PC桌面一樣的系統(tǒng)
這個問題其實(shí)并沒有想象中那么難,只要我們?nèi)バ薷腟urfaceFlinger合成所有Surface的方案,按照PC桌面的樣子合成不就好了嘛,也就是王老師將房子,河,山,按照PC桌面的樣子臨摹最后的白紙上。
如何實(shí)現(xiàn)大屏的單手模式,就是把整個屏幕按比例縮小到屏幕的左下角,或者右下角
這個問題也只需要我們?nèi)バ薷腟urfaceFlinger合成所有Surface的方案就好了,但是這里可能不是簡單的改一下位置,也就是王老師需要按照比例縮小房子,河,山之后再臨摹到到白紙上。PS:但是這僅僅解決了顯示的問題,單手模式還得考慮觸控的問題,需要將坐標(biāo)點(diǎn)等比放大,這里就不仔細(xì)深入探討了。
APP和SurfaceFlinger之間是怎么跨進(jìn)程傳遞Surface
大家都知道一次Binder通信不能傳遞大于1M-8K的數(shù)據(jù),如果不清楚,可以先學(xué)習(xí)一下[007]一次Binder通信最大可以傳輸多大的數(shù)據(jù)?,所有采用的是匿名共享內(nèi)存和Binder結(jié)合的方式傳遞Surface,如果不清楚匿名共享內(nèi)存,可以學(xué)習(xí)一下[006]匿名共享內(nèi)存(Ashmem)的使用
總結(jié)
SurfaceFlinger是一個很有意思進(jìn)程,如果看過了SurfaceFlinger,你會感嘆發(fā)明圖形計算機(jī)的人是真的牛逼。