searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

终端提升流畅性--屏帧率优化(以RK3368为例)

2023-05-15 11:30:27
90
0
帧率就是在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是我们必须得保证的,所以这个不是最重要的。
 
0条评论
0 / 1000
朱****春
17文章数
3粉丝数
朱****春
17 文章 | 3 粉丝
原创

终端提升流畅性--屏帧率优化(以RK3368为例)

2023-05-15 11:30:27
90
0
帧率就是在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是我们必须得保证的,所以这个不是最重要的。
 
文章来自个人专栏
Android系统开发
17 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0