來源:https://source.android.com/devices/graphics/architecture?hl=zh-cn
圖形架構
每位開發(fā)者都應了解有關 Surface蹲盘、SurfaceHolder、EGLSurface铃诬、SurfaceView、GLSurfaceView氧急、SurfaceTexture、TextureView吩坝、SurfaceFlinger 和 Vulkan 方面的知識。
本頁將介紹 Android 系統(tǒng)級圖形架構的基本要素钉寝,并介紹應用框架和多媒體系統(tǒng)如何使用這些要素闸迷。我們會重點介紹圖形數據的緩沖區(qū)是如何在系統(tǒng)中移動的。如果您想了解 SurfaceView 和 TextureView 為何采用現有的運行方式腥沽,或者想要了解 Surface 與 EGLSurface 的交互方式,本文會為您逐一解答今阳。
假設您對 Android 設備和應用開發(fā)已有一定了解。您不需要掌握有關應用框架的詳細知識墓臭,本文也很少提及 API 調用,但本材料與其他公開文檔互不重疊窿锉。本文旨在詳細介紹渲染幀以進行輸出涉及的重要事件,從而幫助您在設計應用時做出明智的選擇嗡载。為此,我們自下而上地介紹了 UI 類的工作原理洼滚,而不是它們的使用方法。
本部分包括多個頁面判沟,從背景材料到 HAL 細節(jié)再到用例,進行了全面介紹挪哄。首先是對 Android 圖形緩沖區(qū)進行了解釋,并說明了合成和顯示機制砸彬,然后繼續(xù)介紹為合成器提供數據的更高級別的機制。我們建議您按照下列順序閱讀相關頁面砂碉,而不要直接跳到感興趣的主題。
低級別組件
BufferQueue 和 gralloc增蹭。BufferQueue 將可生成圖形數據緩沖區(qū)的組件(生產者)連接到接受數據以便進行顯示或進一步處理的組件(消費者)磅摹。通過供應商專用 HAL 接口實現的 gralloc 內存分配器將用于執(zhí)行緩沖區(qū)分配任務。
SurfaceFlinger户誓、Hardware Composer 和虛擬顯示屏。SurfaceFlinger 接受來自多個源的數據緩沖區(qū)帝美,然后將它們進行合成并發(fā)送到顯示屏。Hardware Composer HAL (HWC) 確定使用可用硬件合成緩沖區(qū)的最有效的方法悼潭,虛擬顯示屏使合成輸出可在系統(tǒng)內使用(錄制屏幕或通過網絡發(fā)送屏幕)。
Surface女责、Canvas 和 SurfaceHolder。Surface 可生成一個通常由 SurfaceFlinger 使用的緩沖區(qū)隊列抵知。當渲染到 Surface 上時刷喜,結果最終將出現在傳送給消費者的緩沖區(qū)中。Canvas API 提供一種軟件實現方法(支持硬件加速)掖疮,用于直接在 Surface 上繪圖(OpenGL ES 的低級別替代方案)。與視圖有關的任何內容均涉及到 SurfaceHolder浊闪,其 API 可用于獲取和設置 Surface 參數(如大小和格式)。
EGLSurface 和 OpenGL ES搁宾。OpenGL ES (GLES) 定義了用于與 EGL 結合使用的圖形渲染 API。EGI 是一個規(guī)定如何通過操作系統(tǒng)創(chuàng)建和訪問窗口的庫(要繪制紋理多邊形爽待,請使用 GLES 調用;要將渲染放到屏幕上鸟款,請使用 EGL 調用)。此頁還介紹了 ANativeWindow何什,它是 Java Surface 類的 C/C++ 等價類,用于通過原生代碼創(chuàng)建 EGL 窗口表面处渣。
Vulkan。Vulkan 是一種用于高性能 3D 圖形的低開銷霍比、跨平臺 API。與 OpenGL ES 一樣悠瞬,Vulkan 提供用于在應用中創(chuàng)建高質量實時圖形的工具。Vulkan 的優(yōu)勢包括降低 CPU 開銷以及支持SPIR-V 二進制中間語言浅妆。
高級別組件
SurfaceView 和 GLSurfaceView障癌。SurfaceView 結合了 Surface 和 View。SurfaceView 的 View 組件由 SurfaceFlinger(而不是應用)合成涛浙,從而可以通過單獨的線程/進程渲染摄欲,并與應用界面渲染隔離。GLSurfaceView 提供幫助程序類來管理 EGL 上下文胸墙、線程間通信以及與“Activity 生命周期”的交互(但使用 GLES 時并不需要 GLSurfaceView)按咒。
SurfaceTexture。SurfaceTexture 將 Surface 和 GLES 紋理相結合來創(chuàng)建 BufferQueue励七,而您的應用是 BufferQueue 的消費者。當生產者將新的緩沖區(qū)排入隊列時掠抬,它會通知您的應用。您的應用會依次釋放先前占有的緩沖區(qū)剿另,從隊列中獲取新緩沖區(qū)并執(zhí)行 EGL 調用,從而使 GLES 可將此緩沖區(qū)作為外部紋理使用雨女。Android 7.0 增加了對安全紋理視頻播放的支持,以便用戶能夠對受保護的視頻內容進行 GPU 后處理氛堕。
TextureView。TextureView 結合了 View 和 SurfaceTexture括儒。TextureView 對 SurfaceTexture 進行包裝,并負責響應回調以及獲取新的緩沖區(qū)帮寻。在繪圖時,TextureView 使用最近收到的緩沖區(qū)的內容作為其數據源固逗,根據 View 狀態(tài)指示藕帜,在它應該渲染的任何位置和以它應該采用的任何渲染方式進行渲染。View 合成始終通過 GLES 來執(zhí)行洽故,這意味著內容更新可能會導致其他 View 元素重繪。
Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 3.0 License, and code samples are licensed under theApache 2.0 License. For details, see ourSite Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 八月 24, 2017.
Build