
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 元素)View
物件,可包裝 Surface
物件以進行繪製,並公開方法,可動態指定其大小和格式。途徑檢視畫面可讓您在進行耗用大量資源的作業 (例如遊戲或相機預覽畫面) 時,不必透過 UI 執行緒繪製,但會因此使用額外記憶體。途徑檢視畫面同時支援畫布和 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 執行所有運算,合成的耗電量會降低。
硬體 Composer HAL 會執行另一半的工作,也是所有 Android 圖形算繪作業的中心點。HWC 必須支援事件,其中一個是 VSync (另一個是 hotplug,用於支援即插即用 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 通常用於將圖形算繪至表面,並透過 GL Consumer 和其他工作進行使用。
BufferQueue 可在三種不同模式下運作:
為了執行這項工作的大部分內容,SurfaceFlinger 會充當另一個 OpenGL ES 用戶端。因此,當 SurfaceFlinger 積極將一個或兩個緩衝區合成為第三個緩衝區時,就會使用 OpenGL ES。
硬體編寫器 HAL 會執行另一半的工作。此 HAL 會做為所有 Android 圖形算繪作業的中心點。