? ? ? ? 前幾天跟前同事去海吃海喝,席間不免來套取我司知識(shí)寶庫。為了吹牛逼必然各種夸夸其談,其中說到一個(gè)很有趣的事情,說他們?cè)谧隹D檢測(cè),說高通給做高大上的圖像識(shí)別來識(shí)別卡頓。在恥笑完他們的愚蠢以后,然后慢慢地給介紹下掉幀的概念,超過16.7ms即為掉幀,掉幾幀算卡頓你自己去定義。在他豁然開朗之余,還提出一個(gè)有趣的問題,就是說,既然這樣,是不是可以用幀率來衡量卡頓呢?超過16.7ms就是掉幀,不到60幀一秒就是卡啊。
我批評(píng)了他的愚蠢以后,回家卻深深思考了良久。一來直覺告訴我這就是扯淡,二來居然一時(shí)之間想不出十足的反駁論據(jù)。于是就開始翻閱了下資料,終于勉強(qiáng)湊齊了想要的證據(jù)。
簡(jiǎn)單來說,是因?yàn)椋?b>幀率一般指的是變化幀的幀率。靜止的界面幀率為0,但是并不能說這是掉幀。
FPS的計(jì)算方法:
一般FPS計(jì)算的方法,都是使用adb shell dumpsys SurfaceFlinger --latency,獲取最近127幀垂直同步時(shí)間(記為T2)。計(jì)算T2之間的時(shí)間差值,幀數(shù)除以時(shí)間差,得到幀率。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int(round((frame_count - 1) / seconds))
問題就是在于垂直同步的時(shí)間,怎么來的。
引用AndroidDeveloper的一個(gè)圖,解釋渲染的

CPU把要顯示的東西轉(zhuǎn)換成多邊形、紋理,交給GPU。GPU去做柵格化,柵格化好了,再往下交給屏幕去顯示。但是GPU不是笨蛋,它會(huì)把多邊形和紋理保存在緩存里面,如果你給他的是相同的東西,那么它就什么不做。于是,這里就不會(huì)有一次交給屏幕的過程,這里的垂直同步時(shí)間就會(huì)延長(zhǎng)。這里就是靜止的情形,跟掉幀沒有半毛錢關(guān)系。
好,應(yīng)該就是這個(gè)道理,狡辯結(jié)束。