Android 圖像繪製與渲染

UI 開發是 Android 中的基本操作,優美絢麗的界面是最容易打動人的。但是,Android 的碎片化太嚴重,各種硬件層出不窮,爲了實現設計師妹子的效果,再苦再累也是值得。下面我會介紹 Android 繪製的內容,知其所以然很重要。

1. 屏幕與適配

對於屏幕碎片化問題,Android 推薦使用 dp 作爲尺寸單位,首先要了解 dp、px、density 等概念。

使用 dp 是 Android 推薦的屏幕適配方式,但是以下存在問題:dpi 與 ppi 不一致導致控件大小不統一。

目前業界常用的 UI 適配方法主要有下面幾種:

2. CPU 與 GPU

UI 渲染依賴兩個核心硬件:CPU 和 GPU。UI 組件在繪製到屏幕之前,需要經過柵格化操作,而柵格化非常耗時。GPU 主要用於處理圖形運算,可以加快柵格化的過程。

對於硬件繪製,Android 使用 OpenGL 在 GPU 上完成,OpenGL 是擴平臺的圖形 API,爲 2D/3D 圖形處理硬件制定了標準的軟件接口。軟件繪製使用的是 Skia 庫,它能在低端設備上呈現高質量的 2D 跨平臺圖形。

3. 渲染

Android 圖形系統的整體架構和它包含的主要組件。

如果把應用程序圖形渲染過程當作一次繪畫過程。那麼繪畫過程中,Android 的各個圖形組件的作用是:

  • 畫筆:Skia 或者 OpenGL。我們可以用 Skia 畫筆繪製 2D 圖形,也可以用 OpenGL 來繪 制2D/3D圖形。正如前面所說,前者使用CPU繪製,後者使用 GPU 繪製。

  • 畫紙:Surface。所有的元素都在 Surface 這張畫紙上進行繪製和渲染。在 Android 中,Window 是 View 的容器,每個窗口都會關聯一個 Surface。而 Windowmanager 則負責管理這些窗口,並且把它們的數據傳遞給 Surfaceflinger。

  • 畫板:Graphic Buffer。Graphic Buffer 緩衝用於應用程序圖形的繪製,在 Android 4.1 之前使用的是雙衝機制;在 Android 4.1 之後,使用的是三緩衝機制。

  • 顯示:Surfaceflinger。它將 Windowmanager 提供的所有 Surface,通過硬件合成器 Hardware Composer 合成並輸出到顯示屏。

4. 硬件加速

從 Android 3.0 開始,支持硬件加速,到 4.0 時,默認開啓硬件加速。

硬件加速繪製與軟件繪製整個流程差異非常大,最核心就是我們通過 GPU 完成 Graphic Buffer 的內容繪製。此外硬件繪製還引入了ー個 Display List 的概念,每個 View 內部都有個 Displaylist,當某個 View 需要重繪時,將它標記爲 Dirty。

當需要重繪時,僅僅只需要重繪一個 View 的 Display List,而不是像軟件繪製那樣需要向上遞歸。這樣可以大大減少繪圖的操作數量,因而提高了渲染效率。

硬件加速大大提高來 Android 系統顯示和刷新的速度,但是也存在一些問題:一方面內存消耗,OpenGL API 和Graphic Buffer 緩衝區佔用內存。還存在兼容性問題。

官方文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章