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