Android 圖形架構簡介

許佳佳233發表於2018-11-10

本文參考:https://source.android.com/devices/graphics/architecture

流程

一、無論開發者使用什麼渲染 API,一切內容都會渲染到Surface。(常見API:canvas,openGL)
二、Surface把影象流快取到buffer queue
三、SurfaceFlinger 從多個buffer queue中去獲取影象流執行合併操作
四、 Hardware Composer 去獲取SurfaceFlinger快取的內容實現上屏操作
在這裡插入圖片描述

一、OpenGL渲染流程

這個流程網上講解很多,此處就不多加篇幅了:
1、讀取頂點資料
2、執行頂點著色器
3、組裝圖元
4、光柵化處理
5、片段著色器(這裡涉及常見的二次線性插值,抗鋸齒等)

二、為什麼Surface要有個緩衝區

試想一下,Surface同時會發生有讀寫操作,如果沒有緩衝區,那麼就只能加鎖。
舉個例子,當SufaceFlinger去獲取Surface的影象流時,因為鎖的原因阻塞住了,那麼整個合併的操作就會阻塞住,使用者所看到的就是整個螢幕卡住了,這顯然是不合理的。
比如,此刻有兩個Surface,一個是狀態列的Surface,一個是主螢幕的Surface,當主螢幕因為邏輯原因卡住的時候,那麼不應該會影響到狀態列。

三、為什麼要有SurfaceFlinger的合併操作

一句話其實就是“不能沒有統一管理”。
影象流上屏時,對於硬體來講,它並不知道哪一部分屬於哪個View或者屬於哪個程式,它只會每一幀將整個螢幕中的所有畫素重新整理。
試想如果每個程式或者每個View都不需合併直接去操作程式,那麼很可能一個View正在上屏,而另一個View就發來了上屏請求,螢幕很可能上一個View還沒更新完,就要開始更新下一個,那麼就會出現幀撕裂的情況,如下圖:
在這裡插入圖片描述

四、上屏顯示的過程

這個過程下面的文章講的很不錯,此處直接附上文章地址:
https://blog.csdn.net/michaelcao1980/article/details/43233765

下圖摘自該文章:
在這裡插入圖片描述

相關文章