過度繪製描述的是屏幕上一個像素在單個幀中被重繪了多少次。比如一個有背景的TextView,那麼顯示文本的那些像素至少繪製了兩次,一次是背景,一次是文本。過度繪製是Android平臺上一個很棘手的性能問題,它非常容易出現,幸運的是,它也同樣容易被修復。我們可以通過手機設置裏面的開發者選項,打開Show GPU Overdraw的選項,來查看某個app過度繪製的情況。
顯示這個像素被過度繪製的次數。一共有四種顏色:藍色、綠色、淡紅、深紅。根據過度繪製的次數,依次遞增。1x過度繪製是藍色、2x是綠色、3x是淡紅、4x是深紅。
過渡繪製產生的原因
- 太多重疊的背景
重疊着的背景有時候是有必要的,有時候是沒必要的。這要視你的項目具體情況而定. - 太多疊加的View
或者本來這個UI佈局就很複雜或者你是爲了追求一個炫麗的視覺效果,這都有可能使得很多view疊加在一起。這個情況非常普遍,下面的建議中會談談怎麼減少這種情況帶來的影響。 - 複雜的Layout層級
複雜的層級關係,這個在佈局中也很常見,下面也會說這種情況怎麼做可以儘可能的減少過度繪製。
解決方案建議
- 太多重疊的背景
這個問題其實最容易解決,建議就是檢查你在佈局和代碼中設置的背景,有些背景是被隱藏在底下的,它永遠不可能顯示出來,這種沒必要的背景一定要移除,因爲它很可能會嚴重影響到app的性能。如果採用的是selector的背景,將normal狀態的color設置爲”@android:color/transparent”,也同樣可以解決問題。 - 太多重疊的view
第一個建議是:使用ViewStub來加載一些不常用的佈局,它是一個輕量級且默認不可見的視圖,可以動態的加載一個佈局,只有你用到這個重疊着的view的時候才加載,推遲加載的時間。第二個建議是:如果使用了類似viewpager+Fragment這樣的組合或者有多個Fragment在一個界面上,需要控制Fragment的顯示和隱藏,儘量使用動態地Inflation view,它的性能要比SetVisiblity好。 - 複雜的Layout層級
這裏的建議比較多一些,首先推薦用Android提供的佈局工具Hierarchy Viewer來檢查和優化佈局。第一個建議是:如果嵌套的線性佈局加深了佈局層次,可以使用相對佈局來取代。第二個建議是:用標籤來合併佈局,這可以減少佈局層次。第三個建議是:用標籤來重用佈局,抽取通用的佈局可以讓佈局的邏輯更清晰明瞭。記住,這些建議的最終目的都是使得你的Layout在Hierarchy Viewer裏變得寬而淺,而不是窄而深。
參考文章:http://www.open-open.com/lib/view/open1421656495031.html