帧率就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,
通常用fps(Frames Per Second)表示。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。
高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps)高,所显示的动作就会愈流畅。
如果我们的帧率偏低,那画面的流畅度就会受影响,就会给人造成卡顿滑动不流畅的感觉。
所以,画面帧率越高,体验越好。
我们在网络资料中看到几个重要的帧率数值:
-
12 fps:由于人类眼睛的特殊生理结构,如果所看画面之帧率高于每秒约10-12帧的时候,就会认为是连贯的
-
24 fps:有声电影的拍摄及播放帧率均为每秒24帧,对一般人而言已算可接受
-
30 fps:早期的高动态电子游戏,帧率少于每秒30帧的话就会显得不连贯,这是因为没有动态模糊使流畅度降低
-
60 fps:在实际体验中,60帧相对于30帧有着更好的体验
-
85 fps:一般而言,大脑处理视频的极限
在安卓平板中,最高刷新频率为60fps,所以一般我们的屏幕刷新率只要保证在60HZ就问题不大了。
那么在android系统中,我们的屏的帧率是怎么来的呢?
这里面有一个常用的公式:
display clock =(width+hfp+hbp+hsync)*(height+vfp+vbp+vsync)*fps
通过这个公式,我们可以根据相应的这些参数和帧率得到LCD 的clock。
width和height我们知道是屏幕的分辨率,而hfp/hbp/hsync等等这些又是什么呢?这里简单表一表:
VSYNC 是帧同步信号,每发出一个脉冲,都意味着新的一屏图像数据开始
发送。HSYNC 是行同步信号,每发出一个脉冲都表明新的一行图像资料开始发送。在
帧同步以及行同步的头尾都必须留有回扫时间,这个源自CRT显示器的工业标准。
上图中:上边界(upper margin,vertical back porch)和下边界(low margin,vertical front porch)即为
帧切换的回扫时间,左边界(left margin,horizontal back porch)和右边界(right
margin,horizontal front porch)即为行切换的回扫时间, 水平同步(hsync,
horizontal pulse width)和垂直同步(vsync,vertical pulse width)分别是行和帧同步本身需要的时间。
所以上面的对应关系如下:
Left_margin = HBP(Horizontal Back Porch)
Right_margin = HFP(Horizontal Front Porch)
Hsync = HPW(Horizontal Pulse Width )
Xres = HVD(Horizontal Valid) = height
Upper_margin = VBP(Vertical Back Porch)
low_margin = VFP(Vertical Front Porch)
Vsync = VPW(Vertical Pulse Width)
Yres = VVD(Vertical Valid)= width
以下以当前RK3368的XP13平板的屏的配置为例:
disp_timings_fx: display-timings_fx {
native-mode = <&timing0_fx>;
timing0_fx: timing0_fx {
clock-frequency = <158000000>;
hactive = <1200>;
vactive = <1920>;
hback-porch = <40>;//8 //60 to 20
hfront-porch = <80>;//116
vback-porch = <16>;//2
vfront-porch = <20>;//13
hsync-len = <10>;//16
vsync-len = <4>;//5
hsync-active = <135>;
vsync-active = <216>;
de-active = <0>;
};
};
那么:
width+hfp+hbp+hsync = 1200+80+40+10=1330
height+vfp+vbp+vsync = 1920+20+16+4=1960
如果要设置屏的帧率为55,那么对应的clock为:1330*1960*55= 143374000
注意,我们不要直接写143374000 这个,因为CPU实际是给不到这个准确的clock,我们取个接近的144000000
改完144000000之后我们再看看机器的实际帧率是多少:
如下是clock为158000000时帧率为61:
可能有人会问,是不是我们无限拉高屏的帧率,不就可以无限提高流畅度了吗?
这样的说是不准确的,一方面要看屏是否能够有这种能力,以及屏信号控制器有没有这种能力;另一方面因为屏是被动接收者,而真正的数据图形是从GPU里面出来的,所以这里面就涉及一个配合的问题。
最理想的情况是两者之间的频率是相同且协同进行工作的,在这样的理想条件下,达到了最优解。但实际中显卡的生成图像的频率是变化的,
如果没有有效的技术手段进行保证,两者之间很容易出现这样的情况:当GPU还在渲染下一帧图像时,显示器却已经开始进行绘制,这样就会导致屏幕撕裂。
这会使得屏幕的一部分显示的是前一帧的内容,而另一部分却在显示下一帧的内容。
屏幕撕裂的问题,早在 PC 游戏时代就被发现, 并不停的在尝试进行解决。 其中最知名可能也是最古老的解决方案就是 V-Sync 技术。
V-Sync 的原理简单而直观:产生屏幕撕裂的原因是显卡在屏幕刷新时进行了渲染,而 V-Sync 通过同步渲染/刷新时间的方式来解决这个问题。
显示器的刷新频率为 60 Hz,若此时开启 V-Sync,将控制显卡渲染速度在 60 Hz 以内以匹配显示器刷新频率。这也意味着,在 V-Sync 的限制下,显卡显示性能的极限就限制为 60 Hz 以内。
提高帧率之后,我们需要做哪些测试呢?
1、播放视频压力测试(不同帧率和编码格式的视频均需测试)
2、画面滑动流畅度测试,不同界面和场景下(需对比相同场景下不同帧率的情况)
3、再就是功耗,抬高帧率对电池消耗也就相应的会提高,但我们60fps是我们必须得保证的,所以这个不是最重要的。