Android性能優化典範——通曉過度繪製(Understanding Overdraw)

Overdraw(過度繪製)描述的是屏幕上的某個像素在同一幀的時間內被繪製了多次。在多層次的UI結構裏面,如果不可見的UI也在做繪製的操作,這就會導致某些像素區域被繪製了多次。這就浪費大量的CPU以及GPU資源。比如說,一個TextView後有背景,那麼顯示文本的像素至少繪了兩次,一次是背景,一次是文本,這就好比你在牆壁上先後塗了兩次顏色塗料,甚至後期又貼了牆紙,前面的工作其實就沒有什麼意義了,而且是非必要的。
這裏寫圖片描述
當設計上追求更華麗的視覺效果的時候,我們就容易陷入採用越來越多的層疊組件來實現這種視覺效果的怪圈。這很容易導致大量的性能問題,爲了獲得最佳的性能,我們必須儘量減少Overdraw的情況發生。
幸運的是,我們可以通過手機設置裏面的開發者選項,打開Show GPU Overdraw的選項,可以觀察UI上的Overdraw情況。
這裏寫圖片描述
藍色,淡綠,淡紅,深紅代表了4種不同程度的Overdraw情況,我們的目標就是儘量減少紅色Overdraw,看到更多的藍色區域。
Overdraw有時候是因爲你的UI佈局存在大量重疊的部分,還有的時候是因爲非必須的重疊背景。例如某個Activity有一個背景,然後裏面的Layout又有自己的背景,同時子View又分別有自己的背景。僅僅是通過移除非必須的背景圖片,這就能夠減少大量的紅色Overdraw區域,增加藍色區域的佔比。這一措施能夠顯著提升程序性能。
上面對過度繪製進行了基本的介紹,那麼過度繪製的產生場景有哪些呢,一般冗餘的背景、嵌套的Layout,一般通過如下方案可以解決過度繪製問題:
(1)如果有一個layout中嵌套多個其他view,且view的背景色和被包含的layout的背景色一致,則保持當前layout的背景色不變,將嵌套的其他view的背景色全部改成透明色,既保證該層不會繪製,也同時保證不會出現黑色背景(2)在牽涉到嵌套時,佈局設計應該注意嵌套的佈局的背景色是否和被嵌套的佈局背景色一致,如果一致可以考慮去除相同的背景色,減少繪製;(3)在佈局中,如果存在多個線性佈局重疊時,可以考慮只針對最上層的佈局設置背景色,而不需要每一個佈局(例如LinearLayout)都設置背景色,過多的相同的背景色會導致過度繪製;(4)在設計到activity類中,如果牽涉到的佈局存在背景色,可以考慮消除窗口的背景色,減少1X的繪製。(5)ViewStub的使用,爲了解決重複定義相同佈局的問題(6)merge等標籤的使用,減少在include佈局文件時的層級。

發佈了91 篇原創文章 · 獲贊 10 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章