Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

圖形架構

每個開發人員都應該了解曲面,SurfaceHolder,EGLSurface,SurfaceView,GLSurfaceView,SurfaceTexture,TextureView,SurfaceFlinger和Vulkan。

本頁介紹了Android系統級圖形體系結構的基本元素以及應用程序框架和多媒體系統如何使用它們。重點是圖形數據的緩衝區如何在系統中移動。如果您曾經想知道SurfaceView和TextureView為何表現出它們的行為方式,或者曲面與EGLSurface如何交互,那麼您來對地方了。

假定您對Android設備和應用程序開發有所了解。您不需要了解應用程序框架的詳細知識,並且很少提及API調用,但是該材料不會與其他公共文檔重疊。目的是提供有關渲染框架以輸出時涉及的重要事件的詳細信息,以幫助您在設計應用程序時做出明智的選擇。為了實現這一點,我們從頭開始,描述了UI類的工作方式,而不是如何使用它們。

本節包括幾頁,涵蓋從背景材料到HAL詳細信息到用例的所有內容。它從對Android圖形緩衝區的說明開始,描述了組成和顯示機制,然後繼續向為合成器提供數據的高級機制。建議您按以下順序閱讀頁面,而不要跳到聽起來很有趣的主題。

低級組件

  • BufferQueue和gralloc 。 BufferQueue將生成圖形數據緩衝區的對象(生產者)連接到接受數據以進行顯示或進一步處理的對象(消費者)。緩衝區分配是通過由供應商特定的HAL接口實現的gralloc內存分配器執行的。
  • SurfaceFlinger,Hardware Composer和虛擬顯示器。 SurfaceFlinger接受來自多個源的數據緩衝區,對其進行合成,然後將其發送到顯示器。硬件編輯器HAL(HWC)確定了使用可用硬件複合緩衝區的最有效方法,虛擬顯示器使復合輸出在系統內可用(記錄屏幕或通過網絡發送屏幕)。
  • Surface,canvas和SurfaceHolder 。表面會產生一個緩衝區隊列,SurfaceFlinger通常會使用它。在表面上進行渲染時,結果最終存儲在緩衝區中,該緩衝區將被發送給使用者。 Canvas API提供了一種軟件實現(帶有硬件加速支持),可以直接在表面上繪製(OpenGL ES的低級替代品)。與視圖有關的任何事情都涉及SurfaceHolder,它的API支持獲取和設置表面參數,例如大小和格式。
  • EGLSurface和OpenGL ESOpenGL ES(GLES)定義了一個圖形渲染API,旨在與EGL結合使用,該庫可以通過操作系統創建和訪問窗口(繪製帶紋理的多邊形,請使用GLES調用;在屏幕上進行渲染,請使用EGL調用) )。該頁面還介紹了ANativeWindow,它是Java Surface類的C / C ++等效項,用於從本機代碼創建EGL窗口表面。
  • Vulkan 。 Vulkan是用於高性能3D圖形的低開銷,跨平台API。與OpenGL ES一樣,Vulkan提供了用於在應用程序中創建高質量,實時圖形的工具。 Vulkan的優勢包括減少CPU開銷以及對SPIR-V Binary Intermediate語言的支持。

高級組件

  • SurfaceView和GLSurfaceView 。 SurfaceView結合了表面和視圖。 SurfaceView的視圖組件由SurfaceFlinger(而不是應用程序)合成,從而可以從單獨的線程/進程進行渲染,並與應用程序UI渲染隔離。 GLSurfaceView提供了幫助器類來管理EGL上下文,線程間通信以及與活動生命週期的交互(但是使用GLES並不是必需的)。
  • SurfaceTexture 。 SurfaceTexture將表面和GLES紋理結合在一起,以創建BufferQueue,您的應用程序將作為它的使用者。當生產者將新緩衝區放入隊列時,它會通知您的應用程序,該應用程序隨後釋放先前保留的緩衝區,從隊列中獲取新緩衝區,並進行EGL調用以使該緩衝區可作為外部紋理供GLES使用。 Android 7.0添加了對安全紋理視頻播放的支持,從而可以對受保護的視頻內容進行GPU後處理。
  • TextureView 。 TextureView將視圖與SurfaceTexture結合在一起。 TextureView包裝SurfaceTexture並負責響應回調和獲取新緩衝區。繪製時,TextureView使用最近接收到的緩衝區的內容作為其數據源,無論在何處(無論視圖狀態如何指示)都應渲染。視圖合成始終使用GLES執行,這意味著對內容的更新也可能導致其他視圖元素也重新繪製。