Android圖形子系統(tǒng)詳解
圖形操作可以有兩種方式實(shí)現(xiàn):一是利用通用CPU模擬圖形操作;二是利用GPU專門(mén)做圖形操作。前者會(huì)增加CPU的負(fù)擔(dān),在現(xiàn)在高分辨率已經(jīng)是普遍現(xiàn)象的時(shí)候,讓通用處理器來(lái)完成大量的圖形計(jì)算已經(jīng)不現(xiàn)實(shí)。Android圖形系統(tǒng)的發(fā)展過(guò)程也驗(yàn)證了這一觀點(diǎn)。
為了達(dá)到高效的圖形處理效果,是必須緊密結(jié)合軟件和硬件的。這篇文章主要介紹跟Android的圖形子系統(tǒng)。以后可能會(huì)對(duì)這些主題進(jìn)行更加深入的探討。
Android圖形系統(tǒng)的軟件構(gòu)成
下面的示意圖,展示了Android上負(fù)責(zé)圖形處理的軟件模塊。
一個(gè)典型Android應(yīng)用中各個(gè)圖形系統(tǒng)組件的關(guān)系圖
GPU:
GPU專門(mén)設(shè)計(jì)用于加速圖形操作。GPU不同于CPU,它的一個(gè)設(shè)計(jì)目的就是高度的并行化,并行化是大部分圖形計(jì)算的共同特征。
Android 剛剛問(wèn)世的時(shí)候,GPU還是可選的,最近發(fā)布的版本中,GPU已經(jīng)是一個(gè)必配硬件。如果系統(tǒng)中沒(méi)有GPU,系統(tǒng)使用的OpenGL ES就包含了libagl和pixelflinger,通過(guò)軟件實(shí)現(xiàn)OpenGL ES協(xié)議接口,有時(shí)也有硬件支持的CopyBit。但是不幸的是,Android通過(guò)軟件模擬OpenGL,并不支持OpenGL ES 2.0?,F(xiàn)在,Android系統(tǒng)中的不少組件使用了OpenGL ES 2.0,比如HWUI、Renderscript、SurfaceTexture。平板電腦都有很高的分辨率,純軟件的模擬支持并不能保證圖形的填充需 求,也就不能為用戶提供流暢的UI體驗(yàn)。廠商如果想制造基于ICS或者更高版本Android系統(tǒng)的設(shè)備,就必須具有支持OpenGL ES 2.0 的GPU。
Canvas:
畫(huà)布是應(yīng)用程序用來(lái)繪制Widget或圖形等元素的地 方。Froyo和Gingerbread上,畫(huà)布通過(guò)Skia來(lái)繪制。Honeycomb及以后的版本,HWUI被加入了進(jìn)來(lái),提供了GPU加速支持。在 Ice Cream Sandwich及以后的版本上,HWUI缺省用于圖形的繪制。
Skia:
Skia是一組2D繪圖的API,它完全通過(guò)軟件實(shí)現(xiàn)。由于性能方面的原因,Skia逐漸被HWUI所替代。
HWUI
HWUI 可以使UI組件使用GPU加速。HWUI是在Honeycomb中引入進(jìn)來(lái)的,目的是使交互更加快速,及時(shí)響應(yīng),流暢。在大分辨率的平板電腦上,通過(guò) Skia來(lái)繪制動(dòng)畫(huà),會(huì)占用很高的CPU資源,進(jìn)而拖慢整個(gè)系統(tǒng)。HWUI需要支持OpenGL ES 2.0的GPU,不能通過(guò)軟件模擬。
Renderscript
Renderscript 同樣也是Honeycomb引入的新的API,它的設(shè)計(jì)為了同時(shí)解決移植和性能問(wèn)題。應(yīng)用程序員用Renderscript(基于C99)編寫(xiě)代碼,然后 一個(gè)LLVM的交叉編譯器把它編譯為機(jī)器獨(dú)立的bit code,應(yīng)用程序員再將其打包到apk中。當(dāng)用戶下載apk時(shí),設(shè)備上的編譯器(基于LLVM,位于/system/lib/libbcc.so)將 bit code編譯為目標(biāo)機(jī)器上的指令。
Renderscript在Froyo和Gingerbread上也存在,但是不是公開(kāi)的API。只有Android的一些wallpaper使用了它。那時(shí)它的實(shí)現(xiàn)也非常粗糙,功能有限。
Surface:
一 個(gè)Surface對(duì)應(yīng)一個(gè)屏幕外緩沖區(qū),應(yīng)用程序用來(lái)渲染窗口內(nèi)容。一個(gè)游戲程序,它可能使用OpenGL在Surface上繪制3D對(duì)象,一個(gè)普通應(yīng)用 程序,它可能使用Skia來(lái)繪制Widget或者文本,它也可能使用HWUI庫(kù)來(lái)啟用GPU加速。從ICS開(kāi)始,Surface通過(guò)一個(gè)后端的 SurfaceTexture實(shí)現(xiàn),這就意味著Surface對(duì)應(yīng)的不再是一個(gè)緩沖區(qū),而是一個(gè)紋理(texture)。
Android平臺(tái)的圖形棧
SurfaceFlinger:
SurfaceFlinger是一個(gè)合成器,它管理來(lái)自于不同應(yīng)用的Surface。比如,可能有許多應(yīng)用同時(shí)存在,與此對(duì)應(yīng)的,存在許多獨(dú)立的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,這會(huì)使系統(tǒng)的啟動(dòng)更加復(fù)雜,也會(huì)使模擬器的實(shí)現(xiàn)更加困難。
HW Composer:
硬件合成器是Honeycomb引入的一個(gè)HAL,SurfaceFlinger使用它,利用硬件資源來(lái)加速Surface的合成,比如3D GPU和2D的圖形引擎。
CopyBit:
CopyBit也是一個(gè)HAL。它允許使用特殊硬件來(lái)加速一些圖形操作,比如復(fù)制(blitting)。它設(shè)計(jì)的初衷是在沒(méi)有3D GPU的系統(tǒng)上加速軟件的渲染過(guò)程。CopyBit在ICS中被刪除了,因?yàn)镚PU已經(jīng)成為一個(gè)必備硬件,沒(méi)有必要專門(mén)設(shè)計(jì)一個(gè)加速部件。
Libagl/PixelFlinger:
libagl 是一個(gè)通過(guò)軟件實(shí)現(xiàn)了OpenGL ES 1.0和1.1版本API的組件。它使用PixelFlinger來(lái)實(shí)現(xiàn)OpenGL調(diào)用。為了加速使用PixelFlinger的渲染過(guò)程,JIT被引 入了進(jìn)來(lái),稱為CodeFling。CodeFling生成機(jī)器代碼,它急劇加速了許多類型的像素操作。
可以看出,Android的圖形系統(tǒng)在不斷的調(diào)整,目的是為了提供更加快速流暢的UI體驗(yàn)。這就是Android版本中圖形相關(guān)代碼變動(dòng)很大的原因。