帧率和刷新率
帧率是衡量单个图像(称为帧)在屏幕上显示速度的指标。所有视频实际上都是快速显示的一系列图片。当人眼看到这些图像快速变化时,它会将其解释为运动。 帧速率通常以 FPS 或每秒帧数表示。显然,帧率越高,每秒出现在屏幕上的图像就越多。更多的帧意味着更多的细节,所以在更高的帧速率下运动看起来更流畅。
刷新率是指屏幕更新其显示图像的次数。在 CRT(阴极射线管)显示器的旧时代,这是显示器内的电子枪在屏幕上绘制新图像的次数。低刷新率会导致恼人的闪烁,即当您的眼睛注意到帧之间的亮度变化时。刷新率通常以赫兹 (Hz) 表示。您今天可以买到的几乎所有显示器的刷新率都至少为 60Hz。不过,可以使用更高刷新率的显示器,并且通常用于游戏。
帧率和刷新率的区别:帧速率是计算机、视频游戏控制台、视频播放器或其他设备每秒发送到显示器的图像数量。同时,刷新率是显示器实际显示这些帧的速度。
帧率 > 刷新率
从逻辑上讲,这意味着 GPU 生成帧的速率高于显示硬件可以消耗的速率。当显视器在屏幕上显示任何内容时,它会从称为帧缓冲区的内存区域读取帧。当显示硬件尚未完成绘制一帧并且 GPU 用其他即将到来的帧覆盖帧缓冲区时,我们会在屏幕上看到第一帧的一部分和第二帧的一部分。这称为屏幕撕裂。
![](https://img.haomeiwen.com/i832008/505a356326b2edb5.png)
![](https://img.haomeiwen.com/i832008/052c1f1a56e2faaa.png)
帧率 < 刷新率
通常,不会发现这种情况发生。但假设这种情况发生了,屏幕将在多次刷新后显示相同的帧。从视觉的角度来看,用户不会看到任何差异。
解决办法
VSync 使用称为双缓冲的机制解决了这个问题。它是一种将帧率与显示硬件的刷新率同步的机制
。它规定在当前刷新周期完成之前,GPU 不会将任何新帧复制到帧缓冲区。
![](https://img.haomeiwen.com/i832008/99716eae777252dd.png)
GPU 使用一个缓冲区来写入新帧。它称为后缓冲区,以前使用的帧缓冲区现在称为前缓冲区。所以规则是: “仅当显示硬件的当前刷新周期完成时,帧才会从后缓冲区移动到前缓冲区。”确保看到流畅的 UI。
在 Jelly Bean 4.1 的 android 中引入了垂直同步,在引入 Vsync 之前,输入、动画和绘图没有同步发生。当输入出现时,它被处理,当有动画或视图发生变化时,然后处理它,这导致过多的 CPU 操作,当有一些动画正在进行时,很难处理输入事件。
VSync 是 android Linux 内核以固定间隔定期发布的事件,其中输入处理、动画和窗口绘制以标准顺序同步发生。举个例子,VSync 信号以 16.66 ms 的间隔传送,相当于 60fps。输入处理、动画和窗口绘制在此信号到达时发生
。如果输入事件在 VSync 信号之前到达,它们将被排队 ,在动画完成, UI 重绘完成后在处理它。
Choreographer
Choreographer只是一个抽象,从较低的子系统接收定时脉冲(Vsync)并将命令传递给较高的子系统以渲染即将到来的帧。 每个具有 looper 的线程都会有一个单独的 Choreographer 实例。每个 HandlerThread 实例也会有它自己的 Choreographer。
Choreographer 类有一个回调 onVsync() 来处理 Vsync 信号。
参考
https://www.youtube.com/watch?v=T5WkZcMebfA
https://medium.com/@kiitvishal89/vsyncs-or-vertical-sync-never-heard-of-it-or-did-you-edc055a0decd
https://developer.android.com/reference/android/view/Choreographer
https://www.youtube.com/watch?v=zdQRIYOST64
网友评论