Android 圖形架構 頂 原

每一個開發者都應該瞭解的關於 Surface,SurfaceHolder,EGLSurface,SurfaceView,GLSurfaceView,SurfaceTexture,TextureView,SurfaceFlinger,和 Vulkan 的東西。

本頁描述 Android 系統級圖形架構的必要元素,及應用框架和多媒體系統如何使用它們。重點是圖形數據的緩衝區如何在系統中移動。如果你曾經想知道爲什麼 SurfaceViewTextureView 有着那樣的行爲,或 SurfaceEGLSurface 如何交互,那你就來對地方了。

假設讀者熟悉 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,EGL 爲一個知道如何通過操作系統創建和訪問窗口(繪製紋理多邊形,使用 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 元素也被重繪。

打賞

原文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章