
Android 架構提供多種 2D 和 3D 圖形算繪 API,可與製造商實作的圖形驅動程式互動,因此請務必深入瞭解這些 API 的運作方式。本頁面將介紹這些驅動程式所建構的圖形硬體抽象層 (HAL)。繼續本節之前,請先熟悉下列用語:
Canvas
(API 元素)Surface
物件的合成作業。Canvas
類別提供的方法可繪製標準電腦點陣圖、線條、圓形、矩形、文字等,並繫結至點陣圖或表面。畫布是繪製螢幕上 2D 物件最簡單的方式。基礎類別為 Canvas
。android.graphics.drawable
的子類別。如要進一步瞭解可繪項目和其他資源,請參閱「應用程式資源總覽」。android.opengl
和 javax.microedition.khronos.opengles
套件會公開 OpenGL ES 功能。Surface
(API 元素)Surface
物件大小。請改用 SurfaceView
類別,而非直接使用 Surface
類別。SurfaceView
(API 元素)Surface
物件的 View
物件,用於繪製內容,並公開方法來動態指定大小和格式。SurfaceView 可獨立於 UI 執行緒繪製,適用於遊戲或相機預覽等耗用大量資源的作業,但會因此使用額外記憶體。SurfaceView 同時支援畫布和 OpenGL ES 圖形。SurfaceView
物件的基底類別為 SurfaceView
。R.style
,並以 Theme_
為前置字元。View
(API 元素)View
類別是活動或對話方塊畫面中大多數版面配置元件 (例如文字方塊和視窗) 的基礎類別。View
物件會接收來自父項物件的呼叫 (請參閱 ViewGroup
),以便自行繪製,並向父項物件告知偏好大小和位置,但父項物件可能不會遵守這些資訊。詳情請參閱 View
。ViewGroup
(API 元素)android.widget
套件中,但會擴充 ViewGroup
類別。android.widget
套件中。Window
(API 元素)Window
抽象類別的物件,可指定一般視窗的元素,例如外觀和風格、標題列文字,以及選單的位置和內容。對話方塊和活動會使用 Window
類別的實作項目,來算繪 Window
物件。您不需要在應用程式中實作 Window
類別或使用視窗。應用程式開發人員可以透過三種方式將圖像繪製成螢幕畫面:使用 Canvas、 OpenGL ES 或 Vulkan。
Android 圖像元件
無論開發人員使用哪種算繪 API,所有內容都會算繪到表面上。這個介面代表緩衝區佇列的生產者端,通常由 SurfaceFlinger 耗用。在 Android 平台上建立的每個視窗都會以介面為後盾。SurfaceFlinger 會將所有顯示的介面合成到螢幕上。
下圖顯示主要元件如何協同運作:
圖 1. 平台如何算繪。
以下各節將說明主要元件。
影像串流製作人
圖片串流製作工具可以是任何產生圖形緩衝區供使用的項目。例如 OpenGL ES、Canvas 2D 和 mediaserver 影片解碼器。
映像檔串流消費者
最常見的圖像串流消費者是 SurfaceFlinger,這個系統服務會使用 Window Manager 提供的資訊,取用目前可見的介面,並將其合成到螢幕上。只有 SurfaceFlinger 服務可以修改螢幕內容。SurfaceFlinger 會使用 OpenGL 和硬體合成器 (HWC) 合成一組介面。
其他 OpenGL ES 應用程式也可以使用圖像串流,例如相機應用程式使用相機預覽圖像串流。非 GL 應用程式也可以是消費者,例如 ImageReader 類別。
硬體 Composer
顯示子系統的硬體抽象化。SurfaceFlinger 可以將特定合成工作委派給 HWC,藉此卸載 OpenGL 和 GPU 的工作。SurfaceFlinger 只是另一個 OpenGL ES 用戶端。因此,當 SurfaceFlinger 主動將一或兩個緩衝區合成到第三個緩衝區時,會使用 OpenGL ES。因此,相較於讓 GPU 執行所有運算,合成作業的耗電量較低。
硬體 Compositor HAL 負責執行另一半的工作,是所有 Android 圖像算繪的中心點。HWC 必須支援事件,其中一個是 VSync (另一個是熱插拔,用於支援隨插即用的 HDMI)。
Gralloc
圖像記憶體分配器 (Gralloc) 可分配圖像製作工具要求的記憶體。詳情請參閱「BufferQueue 和 Gralloc」。
資料流程
下圖說明 Android 圖形管道:
圖 2. Android 的圖形資料流程。
左側的物件是產生圖形緩衝區的算繪器,例如主畫面、狀態列和系統 UI。SurfaceFlinger 是合成器,HWC 則是合成器。
BufferQueue
BufferQueue 可在 Android 圖形元件之間提供黏著劑。這是一對佇列,可調解從生產者到消費者的緩衝區持續循環。製作人交出緩衝區後,SurfaceFlinger 負責將所有內容合成到螢幕上。
下圖說明 BufferQueue 通訊程序:
圖 3. BufferQueue 通訊程序。
BufferQueue 包含將圖片串流製作工具和圖片串流消費者繫結在一起的邏輯。舉例來說,相機 HAL 產生的相機預覽畫面或 OpenGL ES 遊戲,都是圖像產生器。圖像消費者的例子包括 SurfaceFlinger,或是顯示 OpenGL ES 串流的其他應用程式,例如顯示相機觀景窗的相機應用程式。
BufferQueue 是一種資料結構,可將緩衝區集區與佇列合併,並使用 Binder 程序間通訊 (IPC) 在程序之間傳遞緩衝區。製作工具介面 (或您傳遞給要產生圖像緩衝區的人員) 是 IGraphicBufferProducer
(SurfaceTexture
的一部分)。BufferQueue 通常用於算繪至 Surface,並透過 GL Consumer 使用,以及其他工作。
BufferQueue 可以透過三種不同模式運作:
為執行大部分工作,SurfaceFlinger 只是另一個 OpenGL ES 用戶端。因此,當 SurfaceFlinger 主動將一或兩個緩衝區合成到第三個緩衝區時,會使用 OpenGL ES。
Hardware Composer HAL 則會執行另一半的工作。這個 HAL 是所有 Android 圖像算繪的中心點。