Android 图形架构
每一個開發者都應該了解的關于 Surface,SurfaceHolder,EGLSurface,SurfaceView,GLSurfaceView,SurfaceTexture,TextureView,SurfaceFlinger,和 Vulkan 的東西。
本頁描述 Android 系統級圖形架構的必要元素及應用框架和多媒體系統如何使用它們。重點是圖形數據的緩沖區如何在系統中移動。如果你曾經想知道為什么 SurfaceView 和 TextureView 有著那樣的行為,或 Surface 和 EGLSurface 如何交互,那你就來對地方了。
假設讀者熟悉 Android 設備和應用開發。你不需要關于應用框架的詳細知識,這里只會提到少量的 API 調用,但這里的資料與其它公開的文檔不重疊。目標是提供關于渲染一幀用以輸出中牽涉的重要事件的詳情,以幫助你在設計應用時做出明智的選擇。為了實現這一點,我們從底層開始,描述 UI 類如何工作,而不是它們如何使用。
這一節包含幾頁,覆蓋了從背景資料到 HAL 細節到使用案例的所有東西。這里從解釋 Android 圖形緩沖區開始,描述合成和顯示機制,然后是提供了數據合成器的更高層機制。我們建議你按下面列出的順序閱讀,而不是直接跳到聽起來很有趣的主題。
底層組件
-
BufferQueue 和 gralloc。BufferQueue 連接生成圖形數據緩沖區的東西(生產者)和接收數據來顯示或進一步處理的東西(消費者)。緩沖區分配通過 gralloc 內存分配器執行, gralloc 內存分配器通過一個特定于供應商的 HAL 接口實現。
-
SurfaceFlinger,Hardware Composer,和虛擬顯示設備。SurfaceFlinger 接受來自于多個源的數據緩沖區,組合它們,然后發送給顯示設備。Hardware Composer HAL (HWC) 決定通過可用硬件和虛擬顯示設備以最高效的方式組合緩沖區使合成的輸出在系統內可用(記錄屏幕或通過網絡發送屏幕)。
-
Surface,Canvas,和 SurfaceHolder。Surface 生產常常由 SurfaceFlinger 消費的緩沖區隊列。當在一個 Surface 上渲染時,結果最終被放入緩沖區中,并被傳送給消費者。Canvas APIs 為直接在一個 Surface (OpenGL ES 的低級替代品)繪制提供了一個軟件實現(通過硬件加速支持)。與 View 有關的任何事情都涉及到 SurfaceHolder,通過它的 API 可以獲取或設置 Surface 參數,比如大小和格式等。
-
EGLSurface 和 OpenGL ES。OpenGL ES (GLES) 定義了一個與 EGL 結合使用的圖形渲染 API,一個知道如何通過操作系統創建和訪問窗口的庫(繪制紋理多邊形,使用 GLES 調用;在屏幕上放置渲染結果,使用EGL調用;)。這頁還描述了 ANativeWindow,Java Surface 類的 C/C++ 等價物,用于在本地層代碼中創建一個 EGL 窗口。
-
Vulkan。Vulkan 是一個低開銷,跨平臺的高性能 3D 圖形 API。像 OpenGL ES 一樣,Vulkan 提供了在應用中創建高品質實時圖形的工具。Vulkan 的優勢包括降低 CPU 開銷并支持 SPIR-V Binary Intermediate 語言。
高層組件
-
SurfaceView 和 GLSurfaceView。SurfaceView 結合了一個 Surface 和一個 View。SurfaceView 的 View 組件由 SurfaceFlinger 合成 (而不是應用),可以在一個分開的線程/進程中渲染,并與應用的 UI 渲染隔離。GLSurfaceView 提供了輔助類來管理 EGL contexts,線程間通信,及與 Activity 生命周期的交互(但使用 GLES 不是必需的)。
-
SurfaceTexture。SurfaceTexture 結合了一個 Surface 和 GLES texture 來創建一個 BufferQueue,你的應用是該 BufferQueue 的消費者。當生產者入隊了一個新 buffer,它通知你的應用,這反過來釋放了之前持有的 buffer,從隊列中獲取新的 buffer,執行 EGL 調用使得 buffer 可以作為 GLES 的一個外部 texture 使用。Android 7.0 添加了對安全 texture video playback的支持,使得 GPU 可以后處理受保護的視頻內容。
-
TextureView。TextureView 結合了一個 View 和一個 SurfaceTexture。TextureView 包裝了一個 SurfaceTexture 并負責響應回調和獲取新 buffers。當繪制時,TextureView 使用最近接收的 buffer 的內容作為它的數據源,根據 View 的狀態繪制它。View 合成總是由 GLES 執行,意味著更新內容可能導致其它的 View 元素也被重繪。
原文
總結
以上是生活随笔為你收集整理的Android 图形架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 图形系统
- 下一篇: Android 模拟器下载、编译及调试