1.流畅度概念的诞生

参考

一.FPS(Frame Per Second)

1s内提交到屏幕的帧数。FPS越高越流畅。
使用FPS衡量手机流畅度的
问题

  1. fps很低,但是app却并不卡顿。因为手机没有很大的绘制需求。比如:在1s内只有15帧的绘制需求,此时fps为15(很低),但是并不卡顿。
  2. App停止操作后,fps仍然在变化。因为屏幕每一帧针对的是手机上的所有进程,自己的app停止了,其他进程可能会引起屏幕界面变化。比如:app停止后,通知栏更新。

二.VSync垂直同步机制

正常情况:
CPU和GPU在16ms内将一帧的内容在back buffer中绘制完成,并和front buffer交换,当下一个VSync同步信号到来时,Display显示front buffer的内容。
图:2-1

image.png

(https://note.youdao.com/yws/public/resource/e1de6ab70a6075f4d9f88daf8c95d14b/xmlnote/BD62E109D38C4BF6AB97D02182A9A6F6/18898)
异常情况:
CPU和GPU绘制一帧的内容的事件超过了16ms,导致了掉帧。

图:2-2


image.png

注意
例子中使用的是双层buffer,实际使用的是三层buffer,可以在下一个Sync信号来临时,如果CPU空闲,CPU可以利用第三个buffer和GPU同时工作。

图:2-3


image.png

三.为什么感到卡顿

因为此帧的渲染时间不符合用户的渲染预期。
(比如:上一帧渲染使用了16ms,但是这一帧渲染使用了32ms,这一帧就不符合渲染预期)

使用垂直同步机制的作用

如果不使用垂直同步机制,因为每帧的内容不同,每帧的绘制时间不相同(单帧绘制波动),此帧的渲染时间不符合用户的渲染预期,所以用户感到卡顿。

如果使用垂直同步机制:
正常情况下(图2-1),每一帧的绘制时间为16ms,帧的渲染时间符合用户预期,用户就不感到卡顿。
丢帧的情况下(图2-2,绘制一帧相当使用了32ms)就会出现渲染时间不符合用户的渲染预期的情况,导致用户感到卡顿。

四.流畅度

4.1 定义:

1s内Loop运行的次数(理想状态是60)

4.2 使用流畅度衡量APP是否流畅的原理:

系统每隔16ms发送一次VSync信号,正常情况下,1s内发送60次VSync信号,Loop运行60次,每次Loop占用16ms(虽然16ms内Loop并不一定一直在工作)

如果因为一帧的绘制任务过多,导致一次Loop的运行时间超过了16ms,此时1s内Loop的运行次数少于60,同时由之前的垂直同步机制可知,此时会出现卡顿。
所以可以使用流畅度(1s内Loop运行的次数)来衡量APP是否流畅。

4.3 问题:怎样知道1s内Loop运行的次数 。

在下一帧到来的时候postFrameCallback指定的callBack会被调用

postFrameCallback(Choreographer.FrameCallback callback)
Posts a frame callback to run on the next frame.

你可能感兴趣的:(1.流畅度概念的诞生)