Android 圖形組件簡介
AOSP->開發->圖形 https://source.android.google.cn/devices/graphics


應用開發者可通過三種方式將影像繪制到螢屏上:使用畫布、OpenGL ES 或 Vulkan,
無論開發者使用什么渲染 API,一切內容都會渲染到 Surface 上,Surface 表示緩沖區佇列中的生產方,而緩沖區佇列通常會被 SurfaceFlinger 消耗,在 Android 平臺上創建的每個視窗都由 Surface 提供支持,所有被渲染的可見 Surface 都被 SurfaceFlinger 合成到螢屏,
圖形架構
每位開發者都應了解有關
Surface、SurfaceHolder、EGLSurface、SurfaceView、GLSurfaceView、SurfaceTexture、TextureView、SurfaceFlinger和Vulkan的知識,
frameworks/native/services/surfaceflinger/
frameworks/native/libs/gui/
低級別組件
- BufferQueue 和 gralloc BufferQueue 將可生成圖形資料緩沖區的組件(生產者)連接到接受資料以便進行顯示或進一步處理的組件(消費者),通過供應商專用 HAL 介面實作的 gralloc 記憶體分配器將用于執行緩沖區分配任務,
- SurfaceFlinger、Hardware Composer 和虛擬顯示屏 SurfaceFlinger 接受來自多個源的資料緩沖區,然后將它們進行合成并發送到顯示屏,Hardware Composer HAL (HWC) 確定使用可用硬體合成緩沖區的最有效的方法,虛擬顯示屏使合成輸出可在系統內使用(錄制螢屏或通過網路發送螢屏),
- Surface、Canvas 和 SurfaceHolder Surface 可生成一個通常由 SurfaceFlinger 使用的緩沖區佇列,當渲染到 Surface 上時,結果最終將出現在傳送給消費者的緩沖區中,Canvas API 提供一種軟體實作方法(支持硬體加速),用于直接在 Surface 上繪圖(OpenGL ES 的低級別替代方案),與視圖有關的任何內容均涉及到 SurfaceHolder,其 API 可用于獲取和設定 Surface 引數(如大小和格式),
- EGLSurface 和 OpenGL ES OpenGL ES (GLES) 定義了旨在與 EGL 結合使用的圖形渲染 API,EGI 是一個通過作業系統創建和訪問視窗的庫(要繪制紋理多邊形,請使用 GLES 呼叫;要將渲染應用到螢屏上,請使用 EGL 呼叫),此頁還介紹了 ANativeWindow,它是 Java Surface 類的 C/C++ 等價類,用于通過原生代碼創建 EGL 視窗表面,
- Vulkan Vulkan 是一種用于高性能 3D 圖形的低開銷、跨平臺 API,與 OpenGL ES 一樣,Vulkan 提供用于在應用中創建高質量實時圖形的工具,Vulkan 的優勢包括降低 CPU 開銷以及支持 SPIR-V 二進制中間語言,
高級別組件
- SurfaceView 和 GLSurfaceView SurfaceView 結合了 Surface 和 View,SurfaceView 的 View 組件由 SurfaceFlinger(而不是應用)合成,從而可以通過單獨的執行緒/行程渲染,并與應用界面渲染隔離,GLSurfaceView 提供了用于管理 EGL 背景關系、執行緒間通信以及與 Activity 生命周期的互動的輔助程式類(但不是必須使用 GLES),
- SurfaceTexture SurfaceTexture 將 Surface 和 GLES 紋理相結合來創建 BufferQueue,而您的應用是 BufferQueue 的消費者,當生產者將新的緩沖區排入佇列時,它會通知您的應用,您的應用會依次釋放先前占用的緩沖區,從佇列中獲取新緩沖區并執行 EGL 呼叫,從而使 GLES 可將此緩沖區作為外部紋理使用,Android 7.0 添加了對安全紋理視頻播放的支持,以便對受保護的視頻內容進行 GPU 后處理,
- TextureView TextureView 結合了 View 和 SurfaceTexture,TextureView 對 SurfaceTexture 進行包裝,并負責回應回呼以及獲取新的緩沖區,在繪圖時,TextureView 使用最近收到的緩沖區的內容作為其資料源,根據 View 狀態指示,在它應該渲染的任何位置和以它應該采用的任何渲染方式進行渲染,View 合成始終通過 GLES 來執行,這意味著內容更新可能會導致其他 View 元素重繪,
圖形資料流

左側的物件是生成圖形緩沖區的渲染器,如主螢屏、狀態欄和系統界面,SurfaceFlinger 是合成器,而硬體混合渲染器是制作器,
BufferQueues 是 Android 圖形組件之間的粘合劑,它們是一對佇列,可以調解緩沖區從生產方到消耗方的固定周期,一旦生產方移交其緩沖區,SurfaceFlinger 便會負責將所有內容合成到顯示部分,

BufferQueue 包含將影像流生產方與影像流消耗方結合在一起的邏輯,影像生產方的一些示例包括由相機 HAL 或 OpenGL ES 游戲生成的相機預覽,影像消耗方的一些示例包括 SurfaceFlinger 或顯示 OpenGL ES 流的另一個應用,如顯示相機取景器的相機應用,
BufferQueue 是將緩沖區池與佇列相結合的資料結構,它使用 Binder IPC 在行程之間傳遞緩沖區,生產方介面,或者您傳遞給想要生成圖形緩沖區的某個人的內容,即是 IGraphicBufferProducer(SurfaceTexture 的一部分),BufferQueue 通常用于渲染到 Surface,并且與 GL 消耗方及其他任務一起消耗內容,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/292081.html
標籤:其他
