]Android性能優化:過度繪製

[譯]Android性能優化課程(二):過度繪製


度繪製描述的是屏幕上一個像素在單個幀中被重繪了多少次。比如一個有背景的TextView,那麼顯示文本的那些像素至少繪製了兩次,一次是背景,一次是文本。過度繪製是Android平臺上一個很棘手的性能問題,它非常容易出現,幸運的是,它也同樣容易被修復。我們可以通過手機設置裏面的開發者選項,打開Show GPU Overdraw的選項,來查看某個app過度繪製的情況。

內容概要

這篇文章大部分內容翻譯自Google的官方視頻教程,優酷地址。除了翻譯視頻內容外,本篇文章還增加了一部分內容:在項目中如何減少程序的過度繪製。

在視頻中,Colt McAnlis會告訴我們什麼是過度繪製,如何檢測過度繪製,以及一個簡單的減少過度繪製的方法。

另外一部分,我會具體談談有哪些方法可以真正減少app的過度繪製。當然,實際情況還得看你的app是如何設計編寫的,這裏只是提供一些通用的方法和建議,並不作爲設計app和程序編寫的準則。


視頻翻譯

  • 過度繪製的概念

如果你粉刷過一個房間或一所房子,就會知道給牆壁塗上顏色需要做大量的工作。假如你還要重新粉刷一次的話,第二次粉刷的顏色會覆蓋住第一次的顏色,第一次的顏色就永遠不可見了,等於你第一次粉刷做的大量工作就完全被浪費掉。這太可怕了。

同樣的道理,如果在你的應用程序中浪費精力去繪製一些東西同樣會產生性能問題。過度繪製這個名詞就是用來描述屏幕上一個像素在單個幀中被重繪了多少次。

  • 過度繪製分析

過度繪製其實是一個性能和設計的交叉點。我們在設計上追求很華麗的視覺效果,但一般來說這種視覺效果會採用非常多的層疊組件來實現,這時候就會帶來過度繪製的問題。比如:我們有一疊UI組件,這些組件從上到下分佈,上面的組件是可以被用戶看見的,而在下面的組件是不可見的,但是我們依然要花很多時間去繪製那些不可見的組件,因爲在某些時候,它也可能會顯示出來。但這確實是在浪費CPU和GPU的資源啊。

  • 檢測過度繪製

當然,爲了讓應用程序得到最大的性能發揮,我們必須把過度繪製減到最少。幸運的是,我們可以通過一個簡單的方法檢測出過度繪製:在手機設置中的開發者選項裏,打開Show GPU Overdraw的選項,就可以檢測某個app界面上過度繪製的情況。

打開這個選項後,你的手機會出現一些奇怪的顏色,請不要驚慌,這是正常的。系統正在你的屏幕上通過給像素繪製不同的顏色來
顯示這個像素被過度繪製的次數。一共有四種顏色:藍色、綠色、淡紅、深紅。根據過度繪製的次數,依次遞增。1x過度繪製是藍色、2x是綠色、3x是淡紅、4x是深紅。

  • 目標和一個簡單的方法

你的目標就是儘可能的減少過度繪製,使得你在屏幕更多的看到的是藍色而不是深紅色。

過度繪製也許是因爲你的UI佈局中存在大量重疊的view,但一個更爲普遍的情況是因爲那些不必要的重疊着的背景。例如某個Activity有一個背景,Layout也有自己的背景,同時它的子View又分別有自己的背景。僅僅是通過移除不需要的背景圖片,就可以使你的應用程序從一大羣那種憤怒的紅色變成一片像大海一樣平靜的藍色。

  • 保持冷靜,keep going

雖然過度繪製很容易出現,但也比較容易消滅。這就是爲什麼你需要我們Android性能課程中的其他資源,不要忘記加入Google+社區哦(繼續推銷Google+中)。分析代碼時請保持冷靜,千萬要記住,性能很重要。(萬年不變的一句結尾)


總結和建議

  • 過度繪製產生的原因
  1. 太多重疊的背景
    重疊着的背景有時候是有必要的,有時候是沒必要的。這要視你的項目具體情況而定.

  2. 太多疊加的View
    或者本來這個UI佈局就很複雜或者你是爲了追求一個炫麗的視覺效果,這都有可能使得很多view疊加在一起。這個情況非常普遍,下面的建議中會談談怎麼減少這種情況帶來的影響。

  3. 複雜的Layout層級
    複雜的層級關係,這個在佈局中也很常見,下面也會說這種情況怎麼做可以儘可能的減少過度繪製。

  • 建議
  1. 太多重疊的背景
    這個問題其實最容易解決,建議就是檢查你在佈局和代碼中設置的背景,有些背景是被隱藏在底下的,它永遠不可能顯示出來,這種沒必要的背景一定要移除,因爲它很可能會嚴重影響到app的性能。如果採用的是selector的背景,將normal狀態的color設置爲”@android:color/transparent”,也同樣可以解決問題。

  2. 太多重疊的view
    第一個建議是:使用ViewStub來加載一些不常用的佈局,它是一個輕量級且默認不可見的視圖,可以動態的加載一個佈局,只有你用到這個重疊着的view的時候才加載,推遲加載的時間。第二個建議是:如果使用了類似viewpager+Fragment這樣的組合或者有多個Fragment在一個界面上,需要控制Fragment的顯示和隱藏,儘量使用動態地Inflation view,它的性能要比SetVisiblity好。

  3. 複雜的Layout層級
    這裏的建議比較多一些,首先推薦用Android提供的佈局工具Hierarchy Viewer來檢查和優化佈局。第一個建議是:如果嵌套的線性佈局加深了佈局層次,可以使用相對佈局來取代。第二個建議是:用標籤來合併佈局,這可以減少佈局層次。第三個建議是:用標籤來重用佈局,抽取通用的佈局可以讓佈局的邏輯更清晰明瞭。記住,這些建議的最終目的都是使得你的Layout在Hierarchy Viewer裏變得寬而淺,而不是窄而深。

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