1. 程式人生 > >Android開發者選項——Gpu呈現模式分析

Android開發者選項——Gpu呈現模式分析

 對於Android使用者來說,無論你用的什麼品牌的手機,在開發者選項中都能發現“玄學曲線”的開關,之所以稱其為玄學曲線,還是因為它被很多網友用於測試一個說不清道不明的東西——流暢度。到底多流暢才叫流暢,多卡才叫卡,標準是什麼?用玄學曲線判斷流暢度到底靠不靠譜兒?今天,就教你如何看懂這玄學曲線。

玄學曲線並不玄 教你如何看懂GPU呈現

    說到玄學曲線其實它的真名叫做“Profile GPU Rendering”,在中文安卓系統下譯為“GPU顯示配置檔案”或“GPU呈現模式分析”等,根據不同廠商定製系統叫法稍有不同。在開啟開發者模式後,找到該條目並選擇第二項“條形顯示”即可看到,不少網友樂此不疲將該曲線發到網上展示,時不時還能看到配字“我的XX這麼貴,刷微博竟然這麼卡”,或是“為什麼剛更新了Android 5.0怎麼曲線還這麼高?”。其實,一些網友並沒有完全理解它而已,有時曲線蹦的高,並不代表卡了。

    開啟玄學曲線後,我們能看到螢幕下方出現連續的柱狀圖,每一根都由紅、黃、藍三色組成,它們分別代表不同含義後面詳細講。除了曲線外,在螢幕上你還可以看到一根水平的綠線,要看懂玄學曲線就要從這根綠線說起。

玄學曲線
綠色水平線標示了16毫秒的位置

    首先,在Android系統中是以每秒60幀為滿幀的,那麼只要將1秒÷60幀,就能得出每幀為16毫秒(ms)時為滿幀的界限,每幀快於16ms即為流暢,而這根綠線所標示的高度即為16ms線,低於綠線即為流暢。

    然後,螢幕下方的柱狀圖每一根代表一幀,其高度表示“渲染這一幀耗時”,隨著手機螢幕介面的變化,柱狀圖會持續重新整理每幀用時的具體情況(通過高度表示)。那麼,當柱狀圖高於綠線,是不是就說明我卡了呢?其實這不完全正確,這裡就要開始分析組成每一根柱狀圖不同顏色所代表的含義了。

玄學曲線

CPU無法直接將命令發給GPU    首先要明白,GPU要繪製什麼樣的檢視是需要CPU發出指令的,但CPU不會直接告訴GPU怎麼做,而是會先將這一命令存入一個“盒子”,在盒子中會形成一個列表,然後GPU從盒子中取出命令進行檢視的渲染繪製。

 明白了上面的過程,下面就該說說圖中不同顏色到底代表了什麼含義。

玄學曲線
刷淘寶時可見紅色部分很高

    紅色代表了“執行時間”,它指的是Android渲染引擎執行盒子中這些繪製命令的時間,假如當前介面的檢視越多,那麼紅色便會“跳”得越高。實際使用中,比如我們平時刷淘寶App時遇到出現多張縮圖需要載入時,那麼紅色會突然跳很高,但是此時你的頁面滑動其實是流暢的,雖然等了零點幾秒圖片才加載出來,但其實這可能並不意味著你卡住了。

玄學曲線
黃色部分通常較短

    黃色通常較短,它代表著CPU通知GPU“你已經完成檢視渲染了”,不過在這裡CPU會等待GPU的回話,當GPU說“好的知道了”,才算完事兒。假如橙色部分很高的話,說明當前GPU過於忙碌,有很多命令需要去處理,比如Android淘寶客戶端,紅色黃色通常會很高。

玄學曲線
藍線過長說明掉幀了

    藍色。假如想通過玄學曲線來判斷流暢度的話,其實藍色的參考意義是較大的。藍色代表了檢視繪製所花費的時間,表示檢視在介面發生變化(更新)的用時情況。當它越短時,即便是體驗上更接近“絲滑”,當他越長時,說明當前檢視較複雜或者無效需要重繪,即我們通常說的“卡了”。

    理解了玄學曲線不同顏色代表的意義,看懂玄學曲線就不難了。一般情況下,當藍色低於綠線時都不會出現卡頓,但是想要追求真正的絲般順滑那當然還是三色全部處於綠線以下最為理想。

玄學曲線
GIF圖會影響玄學曲線

    最後,玄學曲線到底適不適合判斷手機的流暢度呢?其實,就如開啟時他被藏在“開發者選項中”那樣,它其實是用來幫助Android開發者找到介面中渲染問題的小工具,當他們發現曲線出現異常時,就該去做調整和優化了,為使用者提供更好體驗。所以,將Profile GPU Rendering用於測試手機流暢度其實是個小誤區,你的手機不流暢也可能是當前檢視不合理所致,並非效能不足。

特別注意:

從Android 4.1開始,在“開發者選項”中提供了GPU呈現模式分析的選項,GPU呈現模式是一個方便你快速觀察UI渲染效率的工具,主要作用是實時檢視每一幀的渲染效率,定位哪裡存在渲染的效能問題;通過如下方式可以開啟GPU呈現模式分析:“系統設定”→“開發者選項”→“GPU呈現模式分析”→在彈出的視窗中選擇“在螢幕上顯示成條形圖(On screen as bars)”。



開啟GPU呈現模式後,你可以在機器的任何介面看到如下圖所示的條形圖,頂部通知欄、當前活動程式(主視窗)、底部導航欄都會有對應的呈現模式條形圖,用於觀察通知欄、當前活動介面、導航欄的渲染效率。



隨著介面的重新整理,介面上會滾動顯示錘子的柱狀圖來表示每幀畫面說需要的渲染時間,柱狀圖越高表示花費的渲染時間越長。中間有一根綠色的橫線,代表每幀的最長渲染時間:16ms,我們需要確保每一幀花費的總時間都低於這條橫線,這樣才能夠避免出現卡頓的問題。
從圖中可以看出,每一條柱狀線包含三種顏色,但從Android 6.0開始,你看到的每條柱狀線已不止三種顏色:




每種顏色代表每一幀渲染過程中需要完成的某一件事情,因為6.0之前的三種顏色不大能夠清晰地幫助我們定位效能問題的具體原因,所以從6.0開始,將每一幀的渲染過程拆分成了8個步驟,每個步驟一種顏色,每種顏色的意義如下:



(1)Swap Buffers:表示處理任務的時間,也可以說是CPU等待GPU完成任務的時間,線條越高,表示GPU做的事情越多;
(2)Command Issue:表示執行任務的時間,這部分主要是Android進行2D渲染顯示列表的時間,為了將內容繪製到螢幕上,Android需要使用Open GL ES的API介面來繪製顯示列表,紅色線條越高表示需要繪製的檢視更多;
(3)Sync & Upload:表示的是準備當前介面上有待繪製的圖片所耗費的時間,為了減少該段區域的執行時間,我們可以減少螢幕上的圖片數量或者是縮小圖片的大小;
(4)Draw:表示測量和繪製檢視列表所需要的時間,藍色線條越高表示每一幀需要更新很多檢視,或者View的onDraw方法中做了耗時操作;
(5)Measure/Layout:表示佈局的onMeasure與onLayout所花費的時間,一旦時間過長,就需要仔細檢查自己的佈局是不是存在嚴重的效能問題;
(6)Animation:表示計算執行動畫所需要花費的時間,包含的動畫有ObjectAnimator,ViewPropertyAnimator,Transition等等。一旦這裡的執行時間過長,就需要檢查是不是使用了非官方的動畫工具或者是檢查動畫執行的過程中是不是觸發了讀寫操作等等;
(7)Input Handling:表示系統處理輸入事件所耗費的時間,粗略等於對事件處理方法所執行的時間。一旦執行時間過長,意味著在處理使用者的輸入事件的地方執行了複雜的操作;
(8)Misc Time/Vsync Delay:表示在主執行緒執行了太多的任務,導致UI渲染跟不上vSync的訊號而出現掉幀的情況;