安卓專項測試之GPU測試探索
背景
我們在安卓上進行性能測試時,如果想獲取CPU以及內存等常用性能指標,linux系統自身就提供了現成的方法,谷歌官方甚至公司內部也都提供了大量功能強大的分析工具。而相比之下,想要獲取GPU的相關指標則沒那么容易,甚至我們對GPU應該使用什么指標衡量都幾乎一無所知。這一方面是由于系統沒有提供相關接口與命令,另一方面似乎業界目前對于GPU的關注度不足,相關積累與沉淀較少,鑒于此,個人感覺GPU測試這一塊也可以作為終端專項后面需要關注及攻克的課題。
通過這兩天的調研,筆者將GPU的測試方法簡單的分為兩類:
- 安卓官方提供的工具及方法;
- GPU廠商提供的工具及方法。下面將具體介紹這兩類測試分析方法。
一、安卓官方提供的工具
google或者百度“安卓GPU測試”等關鍵詞搜索出來的結果多半屬于這一類方法。這一類方法還有一個顯著的共同點:沒有提供GPU直接關鍵指標,而是通過逐幀計算界面繪制渲染的過程及消耗時間間接呈現GPU的占用。具體工具及使用方法如下:
1. GPU View Updates
開啟方式:設置-開發者選項-顯示GPU視圖更新。主要查看view的更新以及redraw的區域大小。這個工具比較簡單,不做具體介紹。
2. Show GPU Overdraw
開啟方式:設置-開發者選項-調試GPU過度繪制-顯示過度繪制區域。開啟后的效果如下圖:
過度繪制(overdraw)指的是某些組件在屏幕像素點上繪制次數超過一次,不同顏色代表含義如下:
- 無色:無過度繪制,即該像素點只繪制1次
- 藍色:1倍過度繪制,即該像素點繪制了2次
- 綠色:2倍過度繪制,即該像素點繪制了3次
- 淺紅:3倍過度繪制,即該像素點繪制了4次
- 暗紅:4倍過度繪制,即該像素點繪制了5次
在開發及測試的過程中,多倍過度繪制應該是需要特別注意并極力避免的。
3. Profile GPU Rendering
開啟方式:設置-開發者選項-GPU呈現模式分析。
里面有兩個選項:
- 在屏幕上顯示條形圖;
- 在 adb shell dumpsys gfxinfo中。
1、選擇第一項,效果如下:
手機上出現大量GPU繪制信息,每條柱狀信息代表一幀渲染時間,柱子越長代表這一幀的渲染時間越長,不同顏色代表每一幀渲染各個階段所占時長。為確保畫面流暢,系統每秒鐘需要渲染60幀(60fps),即平均每幀渲染時間為16ms,上圖中的綠色橫線即為16ms“警戒線”,超過這個警戒線的柱子代表該幀渲染時間過長,可能造成界面卡頓。
柱子不同顏色的組成代表了每一幀渲染各階段耗時,在4.x的系統中,只分了3個階段,而在5.x系統中細分成4個階段,而在6.0系統中更進一步細分為了9個階段,上圖是6.0系統下呈現的效果,而在4.x系統下的呈現效果如下圖所示:
下面介紹各系統下不同顏色代表的含義:
4.x:
藍色:代表繪制時間,即創建和更新display lists的時間 紅色:代表執行時間,即系統進行2D渲染Display List的時間 橙色:代表處理時間,即CPU等待GPU完成渲染處理的時間
5.x:
新增紫色:代表渲染線程寫入資源所需時間
6.x:
變成9種顏色,將渲染過程中的幾大步驟進一步細分,可以通過Android Studio上的GPU Monitor可以看到各顏色含義更新如下(關于GPU Monitor下一小節會具體介紹):
-
Swap Buffers:對應原先Process(橙色),表示處理任務的時間,也可以說是CPU等待GPU完成任務的時間,線條越高,表示GPU做的事情越多;
-
Command Issue:對應原先Execute(紅色),表示執行任務的時間,這部分主要是Android進行2D渲染顯示列表的時間,為了將內容繪制到屏幕上,Android需要使用Open GL ES的API接口來繪制顯示列表,紅色線條越高表示需要繪制的視圖更多;
-
Sync & Upload:表示的是準備當前界面上有待繪制的圖片所耗費的時間,為了減少該段區域的執行時間,我們可以減少屏幕上的圖片數量或者是縮小圖片的大小;
-
Draw:對應原先Update(藍色),表示測量和繪制視圖列表所需要的時間,藍色線條越高表示每一幀需要更新很多視圖,或者View的onDraw方法中做了耗時操作;
-
Measure/Layout:表示布局的onMeasure與onLayout所花費的時間,一旦時間過長,就需要仔細檢查自己的布局是不是存在嚴重的性能問題;
-
Animation:表示計算執行動畫所需要花費的時間,包含的動畫有ObjectAnimator,ViewPropertyAnimator,Transition等等。一旦這里的執行時間過長,就需要檢查是不是使用了非官方的動畫工具或者是檢查動畫執行的過程中是不是觸發了讀寫操作等等;
-
Input Handling:表示系統處理輸入事件所耗費的時間,粗略等于對事件處理方法所執行的時間。一旦執行時間過長,意味著在處理用戶的輸入事件的地方執行了復雜的操作;
-
Misc Time/Vsync Delay:表示在主線程執行了太多的任務,導致UI渲染跟不上vSync的信號而出現掉幀的情況;出現該線條的時候,可以在Log中看到這樣的日志: I/Choreographer(*): Skipped XXX frames! The application may be doing too much work on its main thread
關于這一部分的具體原理及詳細解釋可以參考Android性能優化典范:
http://hukai.me/android-performance-patterns/ http://hukai.me/android-performance-patterns-season-5/
2、選擇第二項“adb shell dumpsys gfxinfo”,可以在終端中通過“adb shell dumpsy gfxoinfo taskName”命令獲取對應進程的幀渲染日志文件。
4. GPU Monitor
另外,在Android Studio 1.4之后的版本中集成了GPU Monitor,也可以查看每幀的渲染耗時。使用方法如下:
將手機連接電腦病開啟USB調試選項,打開Android Studio并點擊底部的“Android Monitor”,選擇待測的設備與進程,即可看到GPU Monitor的監控結果。以6.0系統為例,可以看到,GPU Monitor中呈現的信息實際上與GPU呈現模式分析中在手機屏幕上顯示的柱狀圖是相同的。
GPU Monitor中展示的柱狀圖的顏色數量也是與系統版本有關的,若使用5.x系統,GPU Monitor中渲染耗時展示如下:
二、GPU廠商提供的工具
上面提到的方法都是通過監控幀渲染時間等手段間接反映GPU的狀態,但是這些工具都不能滿足我們的需求。其實我們的需求很簡單:希望能夠直接獲得GPU占用率或者類似的指標,就如同top命令可以直接查看CPU占用率一樣,簡單快捷。但是,可能是由于相比CPU占用率,大部分開發者對GPU占用率并不是十分關心,不僅Linux/Android沒有提供GPU占用指標,就連Windows上也沒有提供原生的方法。Windows平臺上有一些第三方工具能夠監測顯卡狀態,例如GPU-Z,暫時還不太清楚其工作原理及精確度。而在Linux/Android平臺上似乎還缺少比較權威的第三方監測工具,Linux上可以通過Nvidia提供的nvidia-smi命令獲取GPU參數,但是對其他GPU支持有限。在Android端,高通也提供了一些工具能夠監測GPU的運行情況,但是也僅僅支持使用了高通CPU/GPU的移動設備。高通開發了兩個能夠監測GPU的工具:
- Adreno Profiler;
- Trepn Profiler。
其中,前者是PC端的工具,功能強大,但是使用相對復雜,因此如果測試人員只需要簡單的測試數據,沒有必要使用該工具。有興趣的同學可以在網上檢索資料,官方網站:
https://developer.qualcomm.com/software/adreno-gpu-profiler (復制鏈接在瀏覽器中打開)
本文主要介紹Trepn Profiler。Trepn Profiler是運行在終端上的性能監測工具,在應用寶等各大應用市場均能免費下載。
官方網站:
https://developer.qualcomm.com/software/trepn-power-profiler。 (復制鏈接在瀏覽器中打開)
Trepn Profiler能夠實時監測手機幾項主要性能指標,主要包括CPU、內存、GPU、網絡流量以及電量。其中GPU監測僅支持搭載高通處理器的設備,而其他功能可以在搭載任意處理器的手機上使用。Trepn Profiler使用起來也十分簡單,下面主要介紹如何使用該工具監測并提取GPU數據。
首先打開Trepn Profiler,可以看到以下界面:
各個入口對應了不同的監測指標,以CPU監測為主,而GPU監測隱藏在“Performance Graph”中,點擊該按鈕并劃到最下方:
同CPU占用一樣,這里使用百分比表示了當前GPU的占用情況,剛好能夠滿足我們的需求,完美!但是,非高通機器在這里面是找不到GPU Frequency和GPU Load這兩個指標的。然而這僅僅提供了一個折線圖,如果想獲取更詳細信息,比如說原始數據以及各進程對應的GPU占用,沒關系,Trepn Profiler同樣能夠滿足。
回到首頁,點擊左上角選項按鈕,選擇“ADVANCED MODE”,進入以下界面:
選擇“Profile App”即可選擇監測應用,在Setting中可以選擇監測項目,采樣頻率等高級選項,同時還可以選擇開啟懸浮窗口實時監測。我們選擇監測QQ空間直播過程中的GPU占用情況,并開啟懸浮窗口實時監測GPU狀態,如下圖:
直播結束后,回到Trepn Profiler并選擇“Stop Profiling”,會提示是否保存測試結果,選擇“Save as .csv”,就可以保存測試過程中每次采樣獲得的原始數據。從手機中將csv格式的原始數據撈出來,可以用excel打開或者文本編輯器打開,可以根據后續需要自行選擇數據處理方式。
總結
本文記錄了一個小白探索安卓GPU測試方法的過程并總結了現有的幾個方法,但是筆者感覺本文總結的幾個方法還是存在許多不足,并且對GPU測試相關也仍然存在一些疑問,例如:是否有公認統一的GPU測試衡量指標?第三方(非GPU廠商)能否做到跨硬件平臺的、精確的GPU監控與測試?在專項測試關注的其他幾個領域里,我們都建立了較完善的監控體系和工具集成,而相比之下,本文總結的GPU測試方法就顯得過于簡陋。隨著當前直播業務的火爆以及未來VR/AR技術的逐步普及,將來會有越來越多的非游戲類應用涉及到較大規模的GPU運算。而目前我們專項測試乃至整個業界似乎對于GPU監控與測試的關注度還不夠,所以最后也希望我們專項團隊能夠盡早完善GPU的測試方法以及監測體系。 筆者來自SNG質量部專項技術測試團隊,由于本人剛入職還處于學習階段,在性能/專項測試方面仍然資歷尚淺,之前也沒有接觸過GPU以及圖形學方面的知識,本文若有不準確不嚴謹不完善的地方,也請大家不吝賜教。
來自:http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63