想要懂得制作性能卓越的應(yīng)用,你必須先透徹了解應(yīng)用設(shè)計的原理,如果你不清楚硬件的工作原理,那么你可能無法最大發(fā)揮出它的性能。當(dāng)一個應(yīng)用被渲染時,理解Andorid是如何利用GPU的,可以很大程度的幫助你理解性能方面的問題。

或者說這些xml標(biāo)簽,是如何轉(zhuǎn)換成用戶可見并了解的像素的?從核心上說,這是通過光柵化實(shí)現(xiàn)的。

,這一過程是指將高級對象:比如一個按鈕,一個線條,一個路徑,一個形狀,轉(zhuǎn)化成像素,顯示在屏幕上。光柵化是一個非常耗時的過程,因此移動設(shè)備有一個硬件,專門為光柵化而設(shè)計的:圖形處理器,或者說GPU,在上一個世紀(jì)90年代,被引入主流計算機(jī),其目的是加速光柵化過程,GPU本身設(shè)計要求使用一套特別的基元,將多邊形,紋理,圖像轉(zhuǎn)化成像素的形式,而cpu的作用就是將這些基元送到GPU,這一過程借助Android系統(tǒng)上一套常見的API,叫做openGL ES,

這意味著每當(dāng)你的界面對象比如:按鈕,路徑,復(fù)選框需要繪制到屏幕上時,需要在CPU內(nèi)轉(zhuǎn)化成多邊形或者紋理,然后才能送到GPU進(jìn)行光柵化,如你所想,這個將界面對象轉(zhuǎn)化成多邊形或者紋理的過程,并不是最快的操作、

從CPU傳到GPU的過程也不是很快,所以你會想要減少對象轉(zhuǎn)化的時間,還要減少將對象上傳至繪圖的時間,幸運(yùn)的是,openGL es允許你上傳內(nèi)容到GPU,然后留存在那里,將來你想要畫一個按鈕時,你只需要參照那些已經(jīng)存在于GPU中的網(wǎng)格,告訴GPU怎么繪制就行了,優(yōu)化光柵化性能意味著將盡可能的數(shù)據(jù)存入,留在那里,而且越多越好,盡可能的長時間不動他們,每當(dāng)你更新GPU上的資源時,你都會丟失寶貴的處理時間,而這就是Android系統(tǒng)賴以生存的準(zhǔn)則:盡可能優(yōu)化光柵化性能,比如你的手機(jī)主題提供的資源,也就是位圖和可繪制圖像,會集合在一起,成為一個單獨(dú)的紋理并上傳至GPU,同時還有常用的多邊形網(wǎng)格,比如9-patch圖。

這意味著每當(dāng)你使用這些資源進(jìn)行視圖繪制時,我們都不需要喚醒其他轉(zhuǎn)化,這些都已經(jīng)上傳到GPU里了,因此這些類型的視圖在進(jìn)行繪制時,會非常迅速,不過這一過程會變得越來越復(fù)雜,例如:顯示圖像,cpu加載在存儲設(shè)備里的圖像,并上傳至GPU進(jìn)行繪制,使用路徑創(chuàng)造了另一個單獨(dú)的混亂狀況,因為我們可能需要在cpu里創(chuàng)造一連串的多邊形,甚至可能在GPU上創(chuàng)造一個近似形狀的偽裝紋理:

繪制文字更是雙重災(zāi)難:

cpu上需要將字形光柵化成紋理,然后上傳至GPU,然后返回,每一行的每一個字符都是這樣,在GPU上存儲并繪制這些字形的矩形,動畫會讓這個過程更加復(fù)雜:

因為由于改變了圖形部分,每一幀都有可能需要上傳至GPU進(jìn)行繪制,每一幀都是這樣,一遍又一遍,這還不包括其他一些瘋狂影響GPU性能的因素呢(過度繪制等等)

Andorid不一會將整個應(yīng)用的每一幀都進(jìn)行重新繪制,Android會繪制更新屏幕范圍內(nèi)已經(jīng)修改過的內(nèi)容,從而維護(hù)性能,還有,Andorid為了更好的光柵化,需要處理cpu方面的各種轉(zhuǎn)化和上傳。

棘手的是:為了實(shí)現(xiàn)流暢,保持用戶體驗,你需要完成所有的代碼更新,GPU資源更新,和最后的GPU光柵化,這些都需要在大約16ms內(nèi)完成,動畫的每一幀都是這樣,這也是Android系統(tǒng)的目的,以及Android開發(fā)者很關(guān)注這方面的原因,它可以幫助你如何去編碼,然后去加速應(yīng)用內(nèi)光柵化的過程。好了關(guān)于GPU,CPU在繪制界面的作用到此說明完畢。
