更多關於Android渲染性能請點擊這裏
文章目錄
渲染操作通常依賴於兩個核心組件:CPU與GPU。
- CPU負責包括Measure,Layout,Record,Execute的計算操作
- GPU負責Rasterization(柵格化)操作。
CPU通常存在的問題的原因是存在非必需的視圖組件,它不僅僅會帶來重複的計算操作,而且還會佔用額外的GPU資源。
那麼Android是如何渲染
Activity是如何顯示到屏幕上的,也就是說XML佈局文件是如何轉換成用戶可見的像素圖像
Resterization
從核心上來說,是通過光柵化過程實現。Resterization柵格化是將一個高級對象Button,Shape,Path,String,Bitmap等轉換成紋理像素,拆分到不同的像素上進行顯示
光柵化是一個非常耗時的過程,因此,有一個專門的硬件(圖形處理器)GPU,專門爲加速光柵化過程而設計,在上世紀90年代被引入主流計算機。
GPU本身設計要求使用一套特別的基元,主要是多邊形、紋理也就是所謂的圖像。CPU要在GPU進行屏幕繪製之前將這些基元送至GPU,這一過程在Android中使用Open GL ES來實現。
當你要繪製圖像時,CPU負責把UI組件計算成Polygons,Texture紋理,然後交給GPU進行柵格化渲染。
每次計算和從CPU轉移到GPU是一件很麻煩的事情,要優化性能,就需要減少對象轉化的時間,也要減少將對象上傳至GPU的時間。
OpenGL ES API
OpenGL ES API 允許上傳內容到GPU,可以把那些需要渲染的紋理Hold在GPU Memory裏面,在下次需要渲染的時候直接進行操作。所以如果你更新了GPU所hold住的紋理內容,那麼之前保存的狀態就丟失了。
比如你想要畫一個按鈕,只需要參照之前已經存在於GPU的紋理,告訴OpenGL怎麼繪製就可以了,一般規則是這樣的,儘可能多的存入數據,而且越快越好,然後留在那裏,儘可能長時間不去動它。
Android主題資源
在Android裏面那些由主題所提供的資源,例如Bitmaps,Drawables都是一起打包到統一的Texture紋理當中,然後再傳遞到GPU裏面,這意味着每次你需要使用這些資源的時候,都是直接從紋理裏面進行獲取渲染的。
不同的組件轉化過程
隨着UI組件的越來越豐富,有了更多演變的形態
- 顯示圖片的時候,需要先經過CPU的計算加載到內存中,然後傳遞給GPU進行渲染。
- 特殊的Shape,Path,意味着我們需要在CPU中創造一連串的多邊形,然後再GPU上創建出一個形狀類似的僞裝紋理
- 文字的顯示更加複雜,字形先經過CPU光柵化成紋理,然後再交給GPU進行渲染,然後返回,字符串中的每一個字符都需要這樣在GPU Memory中繪製代表這些字形的矩形
- 動畫會讓這一切更加複雜,由於改變了圖形部分,每一幀都要進行GPU資源上傳,一遍又一遍
Android的diff更新
Android 不會將整個應用的每一幀都重新繪製,Android會更新並繪製屏幕範圍內的已經修改過的內容
Android爲了更好地光柵化處理CPU的各種轉化和上傳
16ms
爲了實現流暢、滿足用戶體驗,我們需要在每一幀16ms以內處理完所有的CPU與GPU計算,繪製,渲染等等操作。