前几天跟前同事去海吃海喝,席间不免来套取我司知识宝库。为了吹牛逼必然各种夸夸其谈,其中说到一个很有趣的事情,说他们在做卡顿检测,说高通给做高大上的图像识别来识别卡顿。在耻笑完他们的愚蠢以后,然后慢慢地给介绍下掉帧的概念,超过16.7ms即为掉帧,掉几帧算卡顿你自己去定义。在他豁然开朗之余,还提出一个有趣的问题,就是说,既然这样,是不是可以用帧率来衡量卡顿呢?超过16.7ms就是掉帧,不到60帧一秒就是卡啊。
我批评了他的愚蠢以后,回家却深深思考了良久。一来直觉告诉我这就是扯淡,二来居然一时之间想不出十足的反驳论据。于是就开始翻阅了下资料,终于勉强凑齐了想要的证据。
简单来说,是因为,帧率一般指的是变化帧的帧率。静止的界面帧率为0,但是并不能说这是掉帧。
FPS的计算方法:
一般FPS计算的方法,都是使用adb shell dumpsys SurfaceFlinger --latency,获取最近127帧垂直同步时间(记为T2)。计算T2之间的时间差值,帧数除以时间差,得到帧率。
int(round((frame_count - 1) / seconds))
问题就是在于垂直同步的时间,怎么来的。
引用AndroidDeveloper的一个图,解释渲染的
CPU把要显示的东西转换成多边形、纹理,交给GPU。GPU去做栅格化,栅格化好了,再往下交给屏幕去显示。但是GPU不是笨蛋,它会把多边形和纹理保存在缓存里面,如果你给他的是相同的东西,那么它就什么不做。于是,这里就不会有一次交给屏幕的过程,这里的垂直同步时间就会延长。这里就是静止的情形,跟掉帧没有半毛钱关系。
好,应该就是这个道理,狡辩结束。