帧率相关知识

帧,就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头。一帧就是一幅静止的画面,连续的帧就形成动画,如电视图图像等。

帧率

帧率(每秒帧数),简单地说,就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。

一般要求连贯性的话,帧数至少要高于每秒约10至12帧的时候,人眼才会认为是连贯的,此现象叫做“视觉暂留现象”,是由人眼的生物构造决定的。通过这个现象,早期的无声电影通过手摇驱动,将画面快速播放,就能让人感觉在播放完整连续的视频。

在典型的显示系统中,不管是手机还是电脑,一般都涉及到三个部分:

  • CPU,中央处理器。用于计算数据,信息处理。
  • GPU,图形处理器。用于处理图像图形,也就是俗称的显卡。
  • display,显示屏幕。用于展示画面,也就是我们的手机屏幕、电脑显示器。

整个显示过程就是:

  • CPU计算屏幕需要的数据,然后交给GPU。
  • GPU对图像进行处理绘制,然后存到缓存区。
  • display再从这个缓存区读取数据,显示出来。

详细过程:16.6ms一到,系统就发送了VSync信号,然后屏幕会从缓存区获取了新的一帧图像并显示出来,与此同时,CPU也开始了下一帧数据的计算,然后计算好交给GPU,最后放到缓存区,等待下一次VSync信号。

掉帧原因:

1、硬件原因。硬件比较差也就是CPU和GPU计算不给力,导致一帧的数据没准备好,所以掉帧。

2、软件原因。在硬件够用的情况下,App或者游戏的一帧数据计算繁杂,嵌套太多或者图太大,也会导致下一帧数据不能在16.6ms中被准备好,导致掉帧。

3、网络原因。在硬件软件都正常情况下,由于网络波动,CPU的计算数据都没有从网络上获取到,那么肯定会导致CPU数据的准备延迟,最终导致掉帧。

画面撕裂原因:

「逐行扫描」就是说,显示器显示画面是从上到下一行一行显示出来的,只不过是显示得比较快所以肉眼看不出来而已。

1.GPU的fps帧率和显示器display的fps帧率不一致导致。例如:GPU为180fps,而显示器的fps为60。也就是显卡一秒钟产生180张画面,而显示器却只能显示60张。那么第二次显示的时候显示器下面就会显示第二张画面。也就是发生画面撕裂。

所以为了防止这种状况,一般显示系统会加入一个双缓存+垂直同步的概念:

首先,开启垂直同步,就会将GPU的fps限制为和显示器的fps一样。

其次,通过双缓存保证一帧数据的连贯性:1、缓存区backBuffer用于CPU/GPU图形处理。

2、缓冲区区frameBuffer用于显示器显示。

这样分工明确之后,屏幕只会读取framebuffer的内容,是一帧完整的画面。而CPU/GPU计算的新一帧内容会放到backbuffer中,不会影响到framebuffer的内容。

只有当屏幕绘制完一帧内容之后,才会将CPU/GPU计算好的新一帧内容也就是backbuffer内容和framebuffer进行交换。

这样导致掉帧会更严重:原因就是因为在第二个VSync信号来的时候,因为backBuffer被GPU占用,所以CPU无法去开始新一帧的计算。

所以三缓存来了:

1、缓存区backBuffer用于CPU/GPU图形处理 。

2、缓存区TripleBuffer用于CPU/GPU图形处理 。

3、缓存区frameBuffer用于显示器显示。

加入了第三个缓存区,那么在第二个VSync信号来的时候,CPU就可以利用TripleBuffer开始新一帧的计算,而无视正在被GPU占用的backBuffer。

你可以理解为 CPU、GPU、Display每个人都有一个缓存区,这样三个就能同时做自己的事而互不影响,最大化利用每个模块。

原文链接:帧率相关知识 - 掘金 (juejin.cn)

你可能感兴趣的:(开发语言)