Google 致力于为黑人社区推动种族平等。查看具体举措
此页面由 Cloud Translation API 翻译。
Switch to English

圖形

Android Graphics HAL圖標

Android框架提供了用於2D和3D的各種圖形渲染API,這些圖形渲染API與圖形驅動程序的製造商實現進行交互,因此重要的是要充分了解這些API在更高級別的工作方式。該頁面介紹了構建這些驅動程序的圖形硬件抽象層(HAL)。

應用程序開發人員通過三種方式在屏幕上繪製圖像: CanvasOpenGL ESVulkan

Android圖形組件

無論開發人員使用什麼渲染API,所有內容都會渲染到surface上 。該表面表示緩衝區隊列的生產方,該緩衝區通常由SurfaceFlinger消耗。在Android平台上創建的每個窗口都有一個表面支持。通過SurfaceFlinger將渲染的所有可見表面合成到顯示器上。

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

圖像渲染組件

圖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進行所有計算相比,這使合成功耗更低。

硬件編輯器HAL進行了另一半工作,並且是所有Android圖形渲染的中心點。硬件編輯器必須支持事件,其中之一是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。

硬件編輯器HAL負責另一半工作。此HAL充當所有Android圖形渲染的中心點。