[009]SurfaceFlinger是什么東西

前言

很多人都聽過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

看下面一個圖

屏幕快照 2019-08-09 下午1.54.50.png

深入思考一個問題

如何實現錘子手機到TNT上,類似PC桌面一樣的系統

這個問題其實并沒有想象中那么難,只要我們去修改SurfaceFlinger合成所有Surface的方案,按照PC桌面的樣子合成不就好了嘛,也就是王老師將房子,河,山,按照PC桌面的樣子臨摹最后的白紙上。

如何實現大屏的單手模式,就是把整個屏幕按比例縮小到屏幕的左下角,或者右下角

這個問題也只需要我們去修改SurfaceFlinger合成所有Surface的方案就好了,但是這里可能不是簡單的改一下位置,也就是王老師需要按照比例縮小房子,河,山之后再臨摹到到白紙上。PS:但是這僅僅解決了顯示的問題,單手模式還得考慮觸控的問題,需要將坐標點等比放大,這里就不仔細深入探討了。

APP和SurfaceFlinger之間是怎么跨進程傳遞Surface

大家都知道一次Binder通信不能傳遞大于1M-8K的數據,如果不清楚,可以先學習一下[007]一次Binder通信最大可以傳輸多大的數據?,所有采用的是匿名共享內存和Binder結合的方式傳遞Surface,如果不清楚匿名共享內存,可以學習一下[006]匿名共享內存(Ashmem)的使用

總結

SurfaceFlinger是一個很有意思進程,如果看過了SurfaceFlinger,你會感嘆發明圖形計算機的人是真的牛逼。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。