Android UI and the GPU

更多關於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計算,繪製,渲染等等操作。

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