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


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

 


    說到玄學曲線其實它的真名叫做“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的信號而出現掉幀的情況;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM