? ? ? ? 前幾天跟前同事去海吃海喝挪挤,席間不免來套取我司知識寶庫。為了吹牛逼必然各種夸夸其談罢浇,其中說到一個很有趣的事情陆赋,說他們在做卡頓檢測沐祷,說高通給做高大上的圖像識別來識別卡頓。在恥笑完他們的愚蠢以后攒岛,然后慢慢地給介紹下掉幀的概念赖临,超過16.7ms即為掉幀,掉幾幀算卡頓你自己去定義灾锯。在他豁然開朗之余兢榨,還提出一個有趣的問題,就是說顺饮,既然這樣吵聪,是不是可以用幀率來衡量卡頓呢?超過16.7ms就是掉幀兼雄,不到60幀一秒就是卡啊吟逝。
我批評了他的愚蠢以后,回家卻深深思考了良久赦肋。一來直覺告訴我這就是扯淡澎办,二來居然一時之間想不出十足的反駁論據(jù)。于是就開始翻閱了下資料金砍,終于勉強(qiáng)湊齊了想要的證據(jù)局蚀。
簡單來說,是因?yàn)椋?b>幀率一般指的是變化幀的幀率恕稠。靜止的界面幀率為0琅绅,但是并不能說這是掉幀。
FPS的計算方法:
一般FPS計算的方法鹅巍,都是使用adb shell dumpsys SurfaceFlinger --latency千扶,獲取最近127幀垂直同步時間(記為T2)。計算T2之間的時間差值骆捧,幀數(shù)除以時間差澎羞,得到幀率。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int(round((frame_count - 1) / seconds))
問題就是在于垂直同步的時間敛苇,怎么來的妆绞。
引用AndroidDeveloper的一個圖,解釋渲染的
CPU把要顯示的東西轉(zhuǎn)換成多邊形枫攀、紋理括饶,交給GPU。GPU去做柵格化来涨,柵格化好了图焰,再往下交給屏幕去顯示。但是GPU不是笨蛋蹦掐,它會把多邊形和紋理保存在緩存里面技羔,如果你給他的是相同的東西僵闯,那么它就什么不做。于是藤滥,這里就不會有一次交給屏幕的過程鳖粟,這里的垂直同步時間就會延長。這里就是靜止的情形超陆,跟掉幀沒有半毛錢關(guān)系牺弹。
好浦马,應(yīng)該就是這個道理时呀,狡辯結(jié)束。