前言
很多人都聽過SurfaceFlinger,但是不清楚Surfaceflinger到底是一個什么東西,我接下來用直白的語言講述一下SurfaceFlinger,這里更多的討論是大體框架,而不是代碼,我一直覺得首先看懂框架,才能去猜測寫代碼的人寫什么東西。
SurfaceFlinger = Surface + Flinger
SurfaceFlinger是一個特殊進程,主要負責合成所有Surface到Framebuffer,然后屏幕去讀取這個Framebuffer,然后顯示給用戶看。
舉個栗子
王老師每天要完成一幅美術作品,美術作品包含三個部分,一個房子,一條小河,一座山,他手下有三個學生A,B,C,王老師給了一個空白的貼紙給A讓他去畫一個房子,給了一個空白的貼紙給B讓他去畫一條河,給了一個空白的貼紙給C讓他去畫一座山。并且通知他們每天12點準時上交貼紙,然后由王老師臨摹三個貼紙上房子,小河,山到了一張固定尺寸的白紙上,每天將當天畫的美術作品給美術館,讓其展覽。
故事中的角色在Android手機中代表什么
學生A,B,C
學生A,B,C對應到Android系統上就是Activity,懸浮窗口,壁紙,導航欄,通知欄。我們可以簡稱一個Window
空白的貼紙
空白的貼紙代表一個Surface,代表一塊可以通過OpenGL或者skia的方式進行繪制的buffer,就是一個內存,或者理解為一個bitmap
每天12點
每天12點就是Vsync信號,所有繪制和合成的時間點,手機里一般是16毫秒一次,因為手機的幀率是60hz
美術作品
美術作品就是FrameBuffer,一塊內存
王老師
王老師就是SurfaceFlinger,負責用OpenGL的將所有的Surface重新繪制到FrameBuffer
美術館
美術館就是手機屏幕,每天展示SurfaceFlinger準備好的FrameBuffer
看下面一個圖
深入思考一個問題
如何實現錘子手機到TNT上,類似PC桌面一樣的系統
這個問題其實并沒有想象中那么難,只要我們去修改SurfaceFlinger合成所有Surface的方案,按照PC桌面的樣子合成不就好了嘛,也就是王老師將房子,河,山,按照PC桌面的樣子臨摹最后的白紙上。
如何實現大屏的單手模式,就是把整個屏幕按比例縮小到屏幕的左下角,或者右下角
這個問題也只需要我們去修改SurfaceFlinger合成所有Surface的方案就好了,但是這里可能不是簡單的改一下位置,也就是王老師需要按照比例縮小房子,河,山之后再臨摹到到白紙上。PS:但是這僅僅解決了顯示的問題,單手模式還得考慮觸控的問題,需要將坐標點等比放大,這里就不仔細深入探討了。
APP和SurfaceFlinger之間是怎么跨進程傳遞Surface
大家都知道一次Binder通信不能傳遞大于1M-8K的數據,如果不清楚,可以先學習一下[007]一次Binder通信最大可以傳輸多大的數據?,所有采用的是匿名共享內存和Binder結合的方式傳遞Surface,如果不清楚匿名共享內存,可以學習一下[006]匿名共享內存(Ashmem)的使用
總結
SurfaceFlinger是一個很有意思進程,如果看過了SurfaceFlinger,你會感嘆發明圖形計算機的人是真的牛逼。