前言
很多人都聽過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ī)的人是真的牛逼弃理。