帧,就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头。一帧就是一幅静止的画面,连续的帧就形成动画,如电视图图像等。
帧率(每秒帧数),简单地说,就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。
一般要求连贯性的话,帧数至少要高于每秒约10至12帧的时候,人眼才会认为是连贯的,此现象叫做“视觉暂留现象”,是由人眼的生物构造决定的。通过这个现象,早期的无声电影通过手摇驱动,将画面快速播放,就能让人感觉在播放完整连续的视频。
在典型的显示系统中,不管是手机还是电脑,一般都涉及到三个部分:
整个显示过程就是:
详细过程: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)