圖形架構

開發人員應瞭解的介面、SurfaceHolder、EGLSurface、SurfaceView、GLSurfaceView、SurfaceTexture、TextureView、SurfaceFlinger 和 Vulkan。

本頁面說明 Android 系統層級圖形架構的重要元素,以及應用程式架構和多媒體系統如何使用這些元素。重點在於圖形資料緩衝區如何在系統中移動。 如果您曾想瞭解 SurfaceView 和 TextureView 的行為方式,或是 Surface 和 EGLSurface 的互動方式,那麼您來對地方了。

本文假設您對 Android 裝置和應用程式開發有一定程度的瞭解。您不需要深入瞭解應用程式架構,且提及的 API 呼叫次數極少,但這些內容不會與其他公開文件重複。本文的目標是詳細說明輸出影格的算繪作業所涉及的重要事件,協助您在設計應用程式時做出明智的選擇。為此,本文將由下而上說明 UI 類別的運作方式,而非說明如何使用這些類別。

本節包含多個頁面,涵蓋從背景資料、HAL 詳細資料到用途的所有內容。課程會先說明 Android 圖像緩衝區,接著介紹組合和顯示機制,然後說明為合成器提供資料的高階機制。建議您依序閱讀下列頁面,不要直接跳到感興趣的主題。

低階元件

  • BufferQueue 和 gralloc。BufferQueue 會將產生圖形資料緩衝區的項目 (製作工具),連結至接受資料以供顯示或進一步處理的項目 (消費者)。緩衝區分配作業是透過 gralloc 記憶體分配器執行,該分配器是透過供應商專屬的 HAL 介面實作。
  • SurfaceFlinger、硬體 Composer 和虛擬螢幕。SurfaceFlinger 會接收來自多個來源的資料緩衝區、將這些緩衝區合成,然後傳送至螢幕。硬體合成器 HAL (HWC) 會判斷使用可用硬體合成緩衝區的最有效方式,而虛擬螢幕會在系統中提供合成輸出內容 (錄製螢幕或透過網路傳送螢幕畫面)。
  • Surface、畫布和 SurfaceHolder。介面會產生緩衝區佇列,通常由 SurfaceFlinger 消耗。在表面上算繪時,結果會進入緩衝區,然後傳送給消費者。Canvas API 提供軟體實作 (支援硬體加速),可直接在表面上繪圖 (OpenGL ES 的低階替代方案)。凡是與檢視區塊相關的項目,都會涉及 SurfaceHolder,其 API 可用於取得及設定大小和格式等介面參數。
  • EGLSurface 和 OpenGL ESOpenGL ES (GLES) 定義的圖形算繪 API 可與 EGL 搭配使用,後者是可透過作業系統建立及存取視窗的程式庫 (如要繪製紋理多邊形,請使用 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 的檢視畫面元件是由 SurfaceFlinger (而非應用程式) 合成,因此可從獨立的執行緒/程序進行算繪,並與應用程式 UI 算繪隔離。GLSurfaceView 提供輔助類別,可管理 EGL 情境、執行緒間通訊,以及與活動生命週期互動 (但使用 GLES 時不一定要使用)。
  • SurfaceTexture。 SurfaceTexture 會結合 Surface 和 GLES 紋理,建立應用程式做為消費者的 BufferQueue。當製作工具將新緩衝區加入佇列時,會通知您的應用程式,而應用程式會釋出先前保留的緩衝區、從佇列取得新緩衝區,並發出 EGL 呼叫,讓緩衝區以外部紋理的形式供 GLES 使用。Android 7.0 新增支援安全紋理影片播放功能,可對受保護的影片內容進行 GPU 後續處理。
  • TextureView。 TextureView 會將檢視區塊與 SurfaceTexture 合併。TextureView 會包裝 SurfaceTexture,並負責回應回呼和取得新緩衝區。繪製時,TextureView 會使用最近收到的緩衝區內容做為資料來源,並根據檢視區塊狀態的指示進行算繪。檢視區塊組合一律使用 GLES 執行,也就是說,內容更新可能會導致其他檢視區塊元素也重新繪製。