Android 過度繪制介紹及優化 Tip

jopen 8年前發布 | 12K 次閱讀 安卓開發 Android開發 移動開發

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!