Android圖形子系統(tǒng)詳解
圖形操作可以有兩種方式實現(xiàn):一是利用通用CPU模擬圖形操作;二是利用GPU專門做圖形操作。前者會增加CPU的負(fù)擔(dān),在現(xiàn)在高分辨率已經(jīng)是普遍現(xiàn)象的時候,讓通用處理器來完成大量的圖形計算已經(jīng)不現(xiàn)實。Android圖形系統(tǒng)的發(fā)展過程也驗證了這一觀點。
為了達(dá)到高效的圖形處理效果,是必須緊密結(jié)合軟件和硬件的。這篇文章主要介紹跟Android的圖形子系統(tǒng)。以后可能會對這些主題進(jìn)行更加深入的探討。
Android圖形系統(tǒng)的軟件構(gòu)成
下面的示意圖,展示了Android上負(fù)責(zé)圖形處理的軟件模塊。

一個典型Android應(yīng)用中各個圖形系統(tǒng)組件的關(guān)系圖
GPU:
GPU專門設(shè)計用于加速圖形操作。GPU不同于CPU,它的一個設(shè)計目的就是高度的并行化,并行化是大部分圖形計算的共同特征。
Android 剛剛問世的時候,GPU還是可選的,最近發(fā)布的版本中,GPU已經(jīng)是一個必配硬件。如果系統(tǒng)中沒有GPU,系統(tǒng)使用的OpenGL ES就包含了libagl和pixelflinger,通過軟件實現(xiàn)OpenGL ES協(xié)議接口,有時也有硬件支持的CopyBit。但是不幸的是,Android通過軟件模擬OpenGL,并不支持OpenGL ES 2.0。現(xiàn)在,Android系統(tǒng)中的不少組件使用了OpenGL ES 2.0,比如HWUI、Renderscript、SurfaceTexture。平板電腦都有很高的分辨率,純軟件的模擬支持并不能保證圖形的填充需 求,也就不能為用戶提供流暢的UI體驗。廠商如果想制造基于ICS或者更高版本Android系統(tǒng)的設(shè)備,就必須具有支持OpenGL ES 2.0 的GPU。
Canvas:
畫布是應(yīng)用程序用來繪制Widget或圖形等元素的地 方。Froyo和Gingerbread上,畫布通過Skia來繪制。Honeycomb及以后的版本,HWUI被加入了進(jìn)來,提供了GPU加速支持。在 Ice Cream Sandwich及以后的版本上,HWUI缺省用于圖形的繪制。
Skia:
Skia是一組2D繪圖的API,它完全通過軟件實現(xiàn)。由于性能方面的原因,Skia逐漸被HWUI所替代。
HWUI
HWUI 可以使UI組件使用GPU加速。HWUI是在Honeycomb中引入進(jìn)來的,目的是使交互更加快速,及時響應(yīng),流暢。在大分辨率的平板電腦上,通過 Skia來繪制動畫,會占用很高的CPU資源,進(jìn)而拖慢整個系統(tǒng)。HWUI需要支持OpenGL ES 2.0的GPU,不能通過軟件模擬。
Renderscript
Renderscript 同樣也是Honeycomb引入的新的API,它的設(shè)計為了同時解決移植和性能問題。應(yīng)用程序員用Renderscript(基于C99)編寫代碼,然后 一個LLVM的交叉編譯器把它編譯為機(jī)器獨立的bit code,應(yīng)用程序員再將其打包到apk中。當(dāng)用戶下載apk時,設(shè)備上的編譯器(基于LLVM,位于/system/lib/libbcc.so)將 bit code編譯為目標(biāo)機(jī)器上的指令。
Renderscript在Froyo和Gingerbread上也存在,但是不是公開的API。只有Android的一些wallpaper使用了它。那時它的實現(xiàn)也非常粗糙,功能有限。
Surface:
一 個Surface對應(yīng)一個屏幕外緩沖區(qū),應(yīng)用程序用來渲染窗口內(nèi)容。一個游戲程序,它可能使用OpenGL在Surface上繪制3D對象,一個普通應(yīng)用 程序,它可能使用Skia來繪制Widget或者文本,它也可能使用HWUI庫來啟用GPU加速。從ICS開始,Surface通過一個后端的 SurfaceTexture實現(xiàn),這就意味著Surface對應(yīng)的不再是一個緩沖區(qū),而是一個紋理(texture)。

Android平臺的圖形棧
SurfaceFlinger:
SurfaceFlinger是一個合成器,它管理來自于不同應(yīng)用的Surface。比如,可能有許多應(yīng)用同時存在,與此對應(yīng)的,存在許多獨立的Surface需要被渲染。SurfaceFlinger決定屏幕上顯示的內(nèi)容,那些需要被覆蓋,進(jìn)行裁剪。
SurfaceFlinger使用的是OpenGL ES 1.1標(biāo)準(zhǔn)中的函數(shù)。為什么呢?如果使用OpenGL ES 2.0,就必須需要支持OpenGL ES 2.0的硬件GPU,這會使系統(tǒng)的啟動更加復(fù)雜,也會使模擬器的實現(xiàn)更加困難。
HW Composer:
硬件合成器是Honeycomb引入的一個HAL,SurfaceFlinger使用它,利用硬件資源來加速Surface的合成,比如3D GPU和2D的圖形引擎。
CopyBit:
CopyBit也是一個HAL。它允許使用特殊硬件來加速一些圖形操作,比如復(fù)制(blitting)。它設(shè)計的初衷是在沒有3D GPU的系統(tǒng)上加速軟件的渲染過程。CopyBit在ICS中被刪除了,因為GPU已經(jīng)成為一個必備硬件,沒有必要專門設(shè)計一個加速部件。
Libagl/PixelFlinger:
libagl 是一個通過軟件實現(xiàn)了OpenGL ES 1.0和1.1版本API的組件。它使用PixelFlinger來實現(xiàn)OpenGL調(diào)用。為了加速使用PixelFlinger的渲染過程,JIT被引 入了進(jìn)來,稱為CodeFling。CodeFling生成機(jī)器代碼,它急劇加速了許多類型的像素操作。
可以看出,Android的圖形系統(tǒng)在不斷的調(diào)整,目的是為了提供更加快速流暢的UI體驗。這就是Android版本中圖形相關(guān)代碼變動很大的原因。




























