Android 過度繪制介紹及優化 Tip
Android 中的過度繪制是指同一個像素被繪制多次,從繪制性能角度講,同一像素點被繪制的次數當然越少越好,這樣有利于減輕 GPU 的工作壓力,事實上,在具體開發過程中 ,不可避免的可能會出現過度繪制,這里,Android 系統本身在開發者選項里已經提供了一個選項開關 Debug GPU overdraw(調試 GPU 過度繪制),用于檢測 App 的過度繪制, 只要打開這個開關,App 界面就會在不同的界面區域根據像素的繪制次數顯示出不同的顏色,下面說說這幾種顏色。
關于過度繪制,也可以去查看官方的相關說明
Debug GPU Overdraw Walkthrough
顏色說明
如果同一個像素點被繪制了兩次,意味著過度繪制了一次,此時顯示藍色,大片的藍色是一種比較理想的狀態。
如果同一個像素點被了繪制三次,意味著過度繪制了二次,此時顯示綠色,如果界面中中等部分的綠色是可以接受的。
如果同一個像素點被繪制了四次,意味著過度繪制了三次,此時顯示淺紅色,如果界面中有小范圍的紅色也是可以接受的。
如果同一個像素點被了繪制五次或者更多(這個繪制的有點過分了啊!),意味著過度繪制了四次,此時顯示暗紅(GPU 發燙時的顏色), This is wrong. Fix it.
下面是一副官方關于顏色說明的圖片。
Note: 如果只被繪制了一次,那么不顯示任何指示顏色,即透明。
實例
上面說了幾種不同狀態對應的顏色,下面結合代碼,我們看看在 App 中過度繪制具體如何表現。
新建應用 OverdrawDemo ,沒有任何邏輯代碼,直接看 Layout 文件,如下所示
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="</LinearLayout></pre>
然后打開 開發者選項的過度繪制選項,效果如下,
![]()
請先忽略 Toolbar 相關的顏色。這里可以看到在內容區域,是沒有過度繪制的指示顏色,因為這片區域確實只被繪制了一次。
此時試想一下,如果為根布局的 LinearLayout 設置背景色,
android:background=“#f4f4f4"此時的界面會是怎樣
![]()
因為這個 Activity 默認已經用主題指定背景繪制了一次內容區域(DecorView),此時在繪制 LinearLayout 時,因為指定 android:background=“#f4f4f4" 的緣故,這片區域的 像素點必然會被繪制兩次,所以此時的內容區域就會顯示為藍色。
同樣的道理,綠色、淺紅色、暗紅色都是根據同一像素點繪制次數的不同,而顯示出來。
為什么要研究過度繪制
對一個 App 來說,它運行時要不停的根據用戶的操作去繪制不同的界面,繪制界面主要由 GPU 控制,如果一個界面過度繪制比較嚴重,大部分界面區域都被 繪制了3、4次甚至更多,那么就會浪費掉 GPU 的很多性能,這對于一個追求有良好體驗 App 的開發者肯定是不允許的。
盡管大部分情況下,App 的過度繪制不可避免,但是在開發中,我們還是應該盡可能去減少過度繪制。
從一定程度上,減少過度繪制會有利于提高 App 的流暢度。目前我們用到的主流 App 都有過度繪制的優化,包括微博微信,他們的首頁在過度繪制方面做的都很不錯, 但是,也有很多 App 在這方面不夠重視亦或者是優化力度不大,如下圖對比了一些優化的比較好的 App 和一些沒有優化的或者優化不夠出色的 App。
![]()
![]()
微信 VS Keep
![]()
![]()
微博 VS 回家吃飯
避免過度繪制的 Tips
既然過度繪制是不好的,那么我們在開發中就應該盡量去減少過渡繪制,這里結合自己網上看到的一些優化 tip ,整理一下。
1、對于我們開發中的用到的 View ,如果對他設置背景顏色沒有意義的,那么我們就應該不要隨便去給他設置背景色。
待補充…
來自: http://gudong.name/technology/2016/01/15/over_draw_color_introduce.html