gstreamer 获取帧数据_Android App卡顿率(顺滑度、顺滑度)并整理数据
概要
測試一個(gè)Android App的卡頓率(流暢性、順滑度)的方法有很多,不同的廠和團(tuán)隊(duì)有他們不同的玩法,有的用高速攝像機(jī)去評(píng)估,有的用肉眼主觀感受,有的通過獲取獲取底層數(shù)據(jù)的去評(píng)估,也有的像本文章一樣,通過Android官方推薦的方法來測試界面性能。本文將會(huì)通過一個(gè)例子,閉環(huán)從數(shù)據(jù)采集到圖表結(jié)果生成。
數(shù)據(jù)準(zhǔn)備
設(shè)置準(zhǔn)備
本方法僅僅適用于Android 6.0(API 級(jí)別)或以上的機(jī)器使用。首先我們打開手機(jī)的【開發(fā)者選項(xiàng)】,從里面找到【GPU呈現(xiàn)模式分析】或者【HWUI呈現(xiàn)模式分析】,點(diǎn)擊它,并選擇如下圖提示的選項(xiàng)。
這樣我們就可以從adb shell dumpsys gfxinfoframestats 中獲取我們需要分析卡頓的具體詳細(xì)信息,如果你沒打開上圖的選項(xiàng),那么你將無法獲得具體的Draw、Prepare、Process、Execute信息。
數(shù)據(jù)提取
確認(rèn)手機(jī)已經(jīng)已經(jīng)連接上你的電腦打開終端(或命令提示符)
打開任意你想測試的App
手動(dòng)或者用錄制好的腳本移動(dòng)你想測試的界面(腳本操作穩(wěn)定,更準(zhǔn)確)
活動(dòng)過程中輸入命令行,把最近操作的120幀的監(jiān)測數(shù)據(jù)寫入C:\datas.csv 里面。adb shell dumpsys gfxinfo com.tencent.qq framestats>c:\datas.csv
數(shù)據(jù)定義解釋
用Excel打開datas.csv,我們可以看到一坨數(shù)據(jù),大家不要慌,我會(huì)給大家解釋重要字段的含義。
首先我們看看這組數(shù)據(jù)
很亂的感覺,不明覺厲吧?看看下表解釋:
| Total frames rendered * | 本次dump搜集了幀信息的數(shù)量 |
| Janky frames * | 上個(gè)字段中耗時(shí)超過16ms的數(shù)量(卡頓率%) |
| XX th percentile | 消耗多少毫秒歸類的百分比 |
| Number Missed Vsync | 垂直同步失敗的幀數(shù)量 |
| Number High input latency * | 高輸入延遲數(shù)-評(píng)估主線程負(fù)擔(dān)大小 |
| Number Slow UI thread * | 因UI線程上的工作導(dǎo)致超時(shí)的幀數(shù) |
| Number Slow bitmap uploads * | 因bitmap的加載耗時(shí)的幀數(shù) |
| Number Slow issue draw commands* | 因繪制導(dǎo)致耗時(shí)的幀數(shù) |
| Number Frame deadline missed | 錯(cuò)過截止日期的幀數(shù) |
| 有“*”的標(biāo)識(shí)重點(diǎn)關(guān)注對(duì)象 |
圖表制作
制作耗時(shí)分布直方圖表
對(duì)應(yīng)datas.csv中“HISTOGRAM” 這個(gè)字段,可以制作耗時(shí)分布直方圖表還是使用Excel去實(shí)現(xiàn),先把上圖這樣的東西分列,按照空格分列,得到如下格式:然后復(fù)制分列后的產(chǎn)物,找個(gè)空表,點(diǎn)擊鼠標(biāo)郵件選擇性粘貼中的轉(zhuǎn)置粘貼,完成如下圖效果:選中這些數(shù)據(jù),按上面提到的方法制作圖表,選擇堆積條形圖即可:通過這個(gè)圖表,我們可以分析出這個(gè)過程中和丟幀率相關(guān)的分布。
制作Draw、Prepare、Process、Execute圖表
先看看這四兄弟的含義:
Draw:表示在Java中創(chuàng)建顯示列表部分中,OnDraw()方法占用的時(shí)間。
Prepare:準(zhǔn)備時(shí)間
Process:表示渲染引擎執(zhí)行顯示列表所花的時(shí)間,view越多,時(shí)間就越長
Execute:表示把一幀數(shù)據(jù)發(fā)送到屏幕上排版顯示實(shí)際花費(fèi)的時(shí)間。其實(shí)是實(shí)際顯示幀數(shù)據(jù)的后臺(tái)緩存區(qū)與前臺(tái)緩沖區(qū)交換后并將前臺(tái)緩沖區(qū)的內(nèi)容顯示到屏幕上的時(shí)間。將上面四個(gè)時(shí)間加起來就是繪制一幀需要的時(shí)間,如果超過16ms就有掉幀了。
這里我們可以整理一下datas.csv中的Draw、Prepare、Process、Execute信息。我們使用Excel來整理,操作如下圖:分列完畢后,我們開始做Draw、Prepare、Process、Execute的圖表,如下圖:好了,我們這樣就擁有了關(guān)于Draw、Prepare、Process、Execute的圖表了。
通過這個(gè)圖表,我們可以分析出4個(gè)過程中最耗時(shí)是哪個(gè)過程,針對(duì)性去優(yōu)化。
總結(jié)
做這些圖,一是希望可以幫助我們分析問題,更直觀找到問題的點(diǎn),其次是可以幫我們歸納總結(jié)和成果展示,對(duì)程序員的積累成長事關(guān)重要。
參考
Android 渲染機(jī)制 Android系統(tǒng)每隔16ms發(fā)出VSYNC(Vertical Synchronization 垂直同步)信號(hào),觸發(fā)對(duì)UI進(jìn)行渲染。如果系統(tǒng)發(fā)出VSYNC信號(hào),而此時(shí)無法進(jìn)行渲染,還在做別的操作,那么就會(huì)導(dǎo)致丟幀的現(xiàn)象,即屏幕的刷新速率大于幀率。之所以是16ms,是因?yàn)槿搜叟c大腦之間的協(xié)作無法感知超過60fps(1000ms/60=16.6ms)的畫面更新,超過60fps也是無意義的。
關(guān)注我大木老濕【碼蟻翻身】,認(rèn)真做事 歡迎私信我文章的改進(jìn)點(diǎn),也可以交流技術(shù)。
總結(jié)
以上是生活随笔為你收集整理的gstreamer 获取帧数据_Android App卡顿率(顺滑度、顺滑度)并整理数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 复杂存储过程学习_对象存储在无人驾驶高精
- 下一篇: python人工智能学多久_Python