![Android 圖形 HAL 圖標](https://source.android.com/static/devices/graphics/images/ape-fwk-hal-graphics.png?authuser=0&hl=zh-tw)
Android 框架提供了多種用於 2D 和 3D 的圖形渲染 API,它們與圖形驅動程序的製造商實現交互,因此了解這些 API 如何在更高級別上工作非常重要。本頁介紹了構建這些驅動程序的圖形硬件抽象層 (HAL)。
應用程序開發人員以三種方式將圖像繪製到屏幕上:使用Canvas 、 OpenGL ES或Vulkan 。
Android 圖形組件
無論開發人員使用什麼渲染 API,一切都被渲染到一個表面上。 Surface 表示通常由 SurfaceFlinger 消耗的緩衝區隊列的生產者端。在 Android 平台上創建的每個窗口都由表面支持。渲染的所有可見表面都由 SurfaceFlinger 合成到顯示器上。
下圖顯示了關鍵組件如何協同工作:
![圖像渲染組件](https://source.android.com/static/devices/graphics/images/ape-fwk-graphics.png?authuser=0&hl=zh-tw)
圖 1.如何渲染表面
主要組件描述如下:
圖像流生產者
圖像流生產者可以是任何產生圖形緩衝區以供消費的東西。示例包括 OpenGL ES、Canvas 2D 和 mediaserver 視頻解碼器。
圖像流消費者
最常見的圖像流消費者是 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(另一個是 hotplug,用於即插即用 HDMI 支持)。
格拉洛克
需要圖形內存分配器 (Gralloc) 來分配圖像製作者請求的內存。有關詳細信息,請參閱Gralloc HAL 。
數據流
有關 Android 圖形管道的描述,請參見下圖:
![圖形數據流](https://source.android.com/static/devices/graphics/images/graphics-pipeline.png?authuser=0&hl=zh-tw)
圖 2.通過 Android 的圖形數據流
左側的對像是生成圖形緩衝區的渲染器,例如主屏幕、狀態欄和系統 UI。 SurfaceFlinger 是合成器,Hardware Composer 是合成器。
緩衝隊列
BufferQueues 提供了 Android 圖形組件之間的粘合劑。這些是一對隊列,它們調解從生產者到消費者的緩衝區的恆定循環。一旦生產者交出他們的緩衝區,SurfaceFlinger 負責將所有內容合成到顯示器上。
BufferQueue 通信流程見下圖。
![BufferQueue通信流程](https://source.android.com/static/devices/graphics/images/bufferqueue.png?authuser=0&hl=zh-tw)
圖 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 圖形渲染的中心點。