圖像

Android 圖形 HAL 圖標

Android 框架提供了各種用於 2D 和 3D 的圖形渲染 API,它們與圖形驅動程式的製造商實作進行交互,因此深入了解這些 API 如何在更高層級上運作非常重要。本頁介紹了這些驅動程式所基於的圖形硬體抽象層 (HAL)。在繼續本部分之前,請先熟悉以下術語:

canvas(通用術語)、 Canvas (API元素)
畫布是一個繪圖表面,用於處理實際位與點陣圖或Surface物件的合成。 Canvas具有用於點陣圖、直線、圓形、矩形、文字等的標準電腦繪圖的方法,並且綁定到位圖或表面。畫布是在螢幕上繪製 2D 物件的最簡單、最容易的方法。基底類別是Canvas
可繪製的
可繪製物件是一種已編譯的視覺資源,可用作背景、標題或螢幕的其他部分。可繪製物件通常會載入到另一個 UI 元素中,例如作為背景圖像。可繪製物件無法接收事件,但可以指派各種其他屬性(例如狀態和調度)以啟用子類別(例如動畫物件或圖像庫)。許多可繪製物件是從可繪製資源檔案(描述影像的 XML 或點陣圖檔案)載入的。 Drawable 資源被編譯為android.graphics.drawable的子類別。有關可繪製物件和其他資源的更多信息,請參閱資源
佈局資源
佈局資源是描述活動螢幕佈局的 XML 檔案。有關詳細信息,請參閱佈局資源
九個補丁(9 個補丁,NinePatch)
九個補丁是一種可調整大小的點陣圖資源,可用於裝置上的背景或其他影像。有關更多信息,請參閱九補丁
OpenGL ES
OpenGL ES 是用於渲染 2D 和 3D 圖形的跨平台 API。 Android 提供了硬體加速 3D 渲染的 OpenGL ES 函式庫。對於 2D 渲染,畫布是更簡單的選擇。 OpenGL ES 可在Android 本機開發套件 (NDK)中使用。 android.opengljavax.microedition.khronos.opengles套件公開 OpenGL ES 功能。
表面(通用術語)、 Surface (API 元素)
表面代表合成在螢幕上的一塊記憶體。 Surface 包含用於繪圖的畫布,並提供各種輔助方法來繪製圖層和調整Surface物件的大小。使用SurfaceView類別而不是直接使用Surface類別。
Surface View(通用術語)、 SurfaceView (API元素)
Surface 視圖是一個View對象,它包裝了用於繪圖的Surface對象,並公開了動態指定其大小和格式的方法。表面視圖提供了一種獨立於 UI 執行緒進行繪製的方法,用於資源密集型操作(例如遊戲或相機預覽),但它會因此使用額外的記憶體。表面視圖支援畫布和 OpenGL ES 圖形。 SurfaceView物件的基底類別是SurfaceView
主題
主題是一組屬性,例如文字大小和背景顏色,它們捆綁在一起以定義各種預設顯示設定。 Android 提供了一些標準主題,在R.style中列出並以Theme_開頭。
視圖(通用術語)、 View (API 元素)
視圖在螢幕上繪製一個矩形區域並處理單擊、按鍵和其他互動事件。 View類別是活動或對話方塊畫面的大多數版面配置元件(例如文字方塊和視窗)的基底類別。 View物件接收來自其父物件(請參閱ViewGroup )的呼叫以繪製自身,並通知其父物件有關其首選大小和位置,這可能不受父物件的尊重。有關詳細信息,請參閱View
視圖群組(通用術語)、 ViewGroup (API 元素)
視圖組對一組子視圖進行分組。視圖組負責決定子視圖的位置和大小,並在適當的時候呼叫每個視圖來繪製自己。有些視圖群組是不可見的並且僅用於佈局,而其他視圖群組則具有固有的 UI,例如滾動列錶框。視圖群組位於widget包中,但擴展了ViewGroup類別。
查看層次結構
視圖層次結構是視圖和視圖群組物件的排列,它定義應用程式每個元件的使用者介面。此層次結構由包含一個或多個子視圖或視圖群組的視圖群組組成。您可以使用 Android SDK 提供的層次結構檢視器來取得視圖層次結構的視覺化表示,以進行偵錯和最佳化。
伏爾甘
Vulkan是一種用於高效能 3D 圖形的低開銷跨平台 API。
小部件
小部件是一組完全實現的視圖子類別之一,用於呈現表單元素和其他 UI 元件,例如文字方塊或彈出式選單。因為小部件已完全實現,所以它可以處理測量、繪製本身以及響應螢幕事件。小工具位於android.widget包中。
視窗(通用術語)、 Window (API 元素)
在 Android 應用程式中,視窗是從Window抽象類別派生的對象,它指定通用視窗的元素,例如外觀、標題列文字以及選單的位置和內容。對話框和活動使用Window類別的實作來呈現Window物件。您不需要在應用程式中實作Window類別或使用視窗。

應用程式開發人員透過三種方式將影像繪製到螢幕上:使用CanvasOpenGL ESVulkan

Android圖形元件

無論開發人員使用什麼渲染 API,所有內容都會渲染到表面上。 Surface 表示通常由 SurfaceFlinger 消耗的緩衝區佇列的生產者端。在 Android 平台上建立的每個視窗都有一個表面支援。渲染的所有可見表面均由 SurfaceFlinger 合成到顯示器上。

下圖顯示了關鍵組件如何協同工作:

影像渲染元件

圖 1.表面是如何渲染的。

主要組成部分說明如下:

影像流生產者

影像流產生器可以是任何產生圖形緩衝區以供使用的東西。範例包括 OpenGL ES、Canvas 2D 和媒體伺服器視訊解碼器。

影像流消費者

影像流最常見的使用者是 SurfaceFlinger,該系統服務使用目前可見的表面並使用視窗管理器提供的資訊將它們合成到顯示器上。 SurfaceFlinger 是唯一可以修改顯示內容的服務。 SurfaceFlinger 使用 OpenGL 和 Hardware Composer 來組成一組表面。

其他 OpenGL ES 應用程式也可以使用影像串流,例如使用相機預覽影像流的相機應用程式。非 GL 應用程式也可以是消費者,例如 ImageReader 類別。

硬體作曲家

顯示子系統的硬體抽象化。 SurfaceFlinger 可以將某些合成工作委託給 Hardware Composer,以卸載 OpenGL 和 GPU 的工作。 SurfaceFlinger 充當另一個 OpenGL ES 用戶端。因此,例如,當 SurfaceFlinger 主動將一個或兩個緩衝區合成到第三個緩衝區時,它正在使用 OpenGL ES。這使得合成比讓 GPU 執行所有運算的功耗更低。

Hardware Composer HAL執行另一半工作,是所有 Android 圖形渲染的中心點。 Hardware Composer 必須支援事件,其中之一是 VSYNC(另一個是用於即插即用 HDMI 支援的熱插拔)。

格拉洛克

需要圖形記憶體分配器 (Gralloc) 來分配影像產生器請求的記憶體。有關詳細信息,請參閱Gralloc HAL

資料流

請參考下圖了解 Android 圖形管道的描述:

圖形資料流

圖 2. Android 中的圖形資料流

左側的物件是產生圖形緩衝區的渲染器,例如主畫面、狀態列和系統 UI。 SurfaceFlinger 是合成器,Hardware Composer 是合成器。

緩衝佇列

BufferQueues 提供了 Android 圖形組件之間的黏合劑。這是一對隊列,負責協調從生產者到消費者的緩衝區恆定循環。一旦生產者交出緩衝區,SurfaceFlinger 就負責將所有內容合成到顯示器上。

BufferQueue通訊流程見下圖。

BufferQueue通訊流程

圖3. BufferQueue通訊流程

BufferQueue 包含將圖像流生產者和圖像流消費者連結在一起的邏輯。影像產生器的一些範例是由相機 HAL 或 OpenGL ES 遊戲產生的相機預覽。影像使用者的一些範例是 SurfaceFlinger 或其他顯示 OpenGL ES 串流的應用程序,例如顯示相機取景器的相機應用程式。

BufferQueue是一種將緩衝池與佇列結合的資料結構,並使用Binder IPC在進程之間傳遞緩衝區。生產者接口,或您傳遞給想要產生圖形緩衝區的人的接口,是 IGraphicBufferProducer ( SurfaceTexture的一部分)。 BufferQueue 通常用於渲染 Surface 並使用 GL Consumer 進行消費等任務。

BufferQueue 可以以三種不同的模式運作:

類別同步模式- BufferQueue 預設以類別同步模式運行,其中來自生產者的每個緩衝區都會從消費者處出去。在此模式下不會丟棄任何緩衝區。如果生產者速度太快且創建緩衝區的速度比耗盡緩衝區的速度快,它將阻塞並等待空閒緩衝區。

非阻塞模式- BufferQueue 也可以在非阻塞模式下運行,在這些情況下它會產生錯誤而不是等待緩衝區。在這種模式下也不會丟棄任何緩衝區。這對於避免可能不理解圖形框架的複雜依賴性的應用程式軟體中潛在的死鎖很有用。

丟棄模式- 最後,BufferQueue 可以配置為丟棄舊緩衝區,而不​​是產生錯誤或等待。例如,如果對紋理視圖進行 GL 渲染並儘快繪製,則必須刪除緩衝區。

為了執行大部分工作,SurfaceFlinger 充當另一個 OpenGL ES 用戶端。因此,例如,當 SurfaceFlinger 主動將一個或兩個緩衝區合成到第三個緩衝區時,它正在使用 OpenGL ES。

Hardware Composer HAL 執行另一半工作。該 HAL 充當所有 Android 圖形渲染的中心點。