vsync(vsynccount)
最近有很多小伙伴咨询关于vsync的问题,小编结合多年的经验整理出来一些vsynccount对应的资料,分享给大家。
本文目录:
- 1、
- 2、
- 3、
- 4、
- 5、
Vsync同步机制 一
Vsync(垂直同步信号量),用来同步渲染,让AppUI和SurfaceFlinger可以按硬件产生的VSync节奏进行工作。
Vsync要解决的问题:
为什么会产生这样的问题?
CPU负责对UI进行更新,GPU负责对UI进行渲染,两者的频率不一致,会导致CPU还未更新完成,就被GPU渲染到了屏幕上。所以会出现图片上的问题。
如何解决这个问题?
解决这个问题的方法就是让CPU和GPU以相同的节奏进行工作。如下图所示
让CPU和GPU以相同的频率进行工作,这就是Vsync要做的工作。Vsync以固定的频率发出信号,每当收到CPU先对UI进行更新,然后GPU再进行绘制,这样就可以解决上面的问题了。
那Android的Vsync机制是如何进行的呢?
这张图可以很明显的看出Vsync事件的传递过程。
Vsync信号并不是有硬件直接产生,而是由DispSync线程产生的。DispSync会根据HWC产生的VSync进行采样,创建模型,然后输出了SW_VSYNC信号,SW_VSYNC再根据SF和APP的phase offset做调整,分别输出给Vsync-sf和Vsync-app。
再看下几个类之间的关系图
在分析HWComposer的时候,HWComposer中会注册硬件Vsync事件回调,在硬件Vsync事件到来的时候,回调HWComposer的vsync函数。
HWComposer接收到硬件的Vsync事件并没有直接传递给系统使用,而是通过SurfaceFlinger将Vsync事件,添加到了DispSync的Vsync事件样本,当DispSync采样完成后,则会停止硬件Vsync事件,由软件Vsync根据样本的计算结果产生Vsync事件。
mPrimaryHWVsyncEnabled变量控制DispSync是否需要采集样本,当模型Vsync周期有误差时需要重新打开硬件Vsync,再次采集硬件Vsync样本。
addResyncSample方法主要作用是添加采样样本到Buffer中,DispSync中维护了一个环形的Buffer,大小为32个,每当有新样本过来时候,则将样本添加到Buffer中,如果Buffer已经满了,则替换掉最老的样本。
样本更新后调用updateModelLocked来计算更新DispSync模型。
计算平均周期模型和平均偏差模型。
如何计算平均周期?
将所有样本的间隔时间相加,然后除以间隔数,求出平均间隔时间.
如何计算平均偏差?
如果完全准时的样本,应该可以整除平均,余数为0,有偏差的则余数不为0,所以对所有的样本除以mPeriod平均周期时间,计算余数,将余数又转换成弧度. 计算X和Y, 求X和Y的平均值,然后再由平均X,Y求出弧度,再转换成偏差值。这样就计算出平均偏差了.
调用VsyncThread的mCond.signal()通知VsyncThread模型更新完成。
SurfaceFlinger的Vsync并不是直接使用硬件产生Vsync,而是由软件根据硬件Vsync创建了一个数据模型来模拟产生Vsync信号。负责产生软件Vsync信号的就是DispSync。
DispSync是SurfaceFlinger中的一个变量。
mPrimaryDispSync就是Vsync的信号源,我们先看下Vsync信号是如何产生的?
DispSync对象在创建的时候会启动一个VsyncThread线程,该线程用于模拟Vsync信号。然后我们看下VsyncThread线程的threadloop方法
VsyncThread刚开始由于mPeriod=0,也就是说当前线程还不知道按照什么样的频率产生Vsync信号,所以会等待mPeriod周期模型的更新。
什么时候设置更新mPeriod的时间呢?
就是上面提到的,应用模型样本计算完成后会设置mPeriod和mPhase,这样VsyncThread就会继续执行
当有Vsync的周期时间和偏差时间后,VsyncThread就可以模拟产生软件Vsync信号了。产生Vsync信号就会通过回调接口通知监听者.
DispVsync有两个监听者,就是我们上面提到的SurfaceFlinger和APP,SurfaceFlinger和App所需要的Vsync时间不是完全一致。App一般先接到Vsync信号,还是绘制UI,然后SurfaceFlinger再接收到Vsync信号完成UI合成。
VsyncThread做了什么事情呢?
首先计算下次Vsync产生的时间,计算下次产生时间会根据两个监听者上次接收到Vsync时间,然后加上周期时间,偏差时间,和APP或者SF自己的偏差时间。得到下次Vsync时间。
得到最近的下次执行时间,Vsync只要Wait相应的时间差就可了,等到执行时间后回调SF或者APP的Vsync信号。这样Vsync信号就产生了.
上面讲DispSync提到,DispSync有两个监听者,这两个监听这就是两个DisplaySyncSource对象。两个对象是在SurfaceFlinger的init进程创建的.
init中创建了两个DispSyncSource对象, 一个是SF的sfVsyncSrc,一个是SurfaceFlinger的sfVsyncSrc对象. DiplaySyncSource构造方法中会保存一个syncOffet值,表示自己收到Vsync偏差时间.
DispSync计算Vsync产生时间的时候,会根据这个偏差进行计算.也就是上面公式中的自定义偏差offset。
DispSync有一些重要的函数,具体如下:
这样,我们就大概理解了Vsync信号的产生过程。
1:HWC硬件产生Vsync信号,给DispSync添加样本
2:DispSync根据样本计算Vsync周期,然后产生软件Vsync信号。计算Vsync事件会根据不同的Listenr计算不同的时间.
3:DisplaySyncSource是DispSync的监听者,有两个DisplaySyncSource对象,分别代表SF和APP的DisplaySyncSource,两个回调的Vsync时间不同.
4:DisplaySyncSource收到Vsync事件后,会发给他自己的监听者EventThread
EventThread收到Vsync时间后会存放到mVSyncEvent[0]中,通知EventThread线程进行处理。
为什么要有两个DisplaySyncSource且时间不一样呢?
具体如上图所示
App绘制UI, 绘制完成后交给SurfaceFlinger进行合成, 所以App绘制时间优先于SF合成时间,将两者时间错开,避免资源竞争,增加效率。如何APP和SF的偏差时间设置好的话,APP + SF在一个Vsync周期内就可以绘制合成,在下一个Vsync周期到来的时候就可以显示到屏幕上了。
vsync是什么意思?
vsync垂直同步[电]:vertical synchronizationvertical synchronization
英 [ˈvɜːtɪkl ˌsɪŋkrənaɪ'zeɪʃ(ə)n] 美 [ˈvɜːrtɪkl ˌsɪŋkrənaɪ'zeɪʃ(ə)n]
垂直同步信号;垂直同步;垂直同期;使用垂直同步;
For options, extra parameters for controlling horizontal and vertical synchronization can be added, and there are also options for interlaced and doublescan modes.
另外,还可以添加其他参数作为选项来控制水平和垂直的同步值,还有一些选项可以控制隔行模式和双屏模式。
The module has the capability of generating and outputting one channel of monochromatic and one channel of RGB color video signal. And it can output composite synchronization signal, horizontal and vertical synchronization signals.
本文设计的模块具备同时产生并输出一路单色及一路RGB彩色视频信号的能力,还可以输出复合同步信号和分离的行场同步信号,叠加外部的视频信号。
帧率和刷新率 VSync
帧率是衡量单个图像(称为帧)在屏幕上显示速度的指标。所有视频实际上都是快速显示的一系列图片。当人眼看到这些图像快速变化时,它会将其解释为运动。 帧速率通常以 FPS 或每秒帧数表示。显然,帧率越高,每秒出现在屏幕上的图像就越多。更多的帧意味着更多的细节,所以在更高的帧速率下运动看起来更流畅。
刷新率是指屏幕更新其显示图像的次数。在 CRT(阴极射线管)显示器的旧时代,这是显示器内的电子枪在屏幕上绘制新图像的次数。低刷新率会导致恼人的闪烁,即当您的眼睛注意到帧之间的亮度变化时。刷新率通常以赫兹 (Hz) 表示。您今天可以买到的几乎所有显示器的刷新率都至少为 60Hz。不过,可以使用更高刷新率的显示器,并且通常用于游戏。
帧率和刷新率的区别:帧速率是计算机、视频游戏控制台、视频播放器或其他设备每秒发送到显示器的图像数量。同时,刷新率是显示器实际显示这些帧的速度。
从逻辑上讲,这意味着 GPU 生成帧的速率高于显示硬件可以消耗的速率。当显视器在屏幕上显示任何内容时,它会从称为帧缓冲区的内存区域读取帧。当显示硬件尚未完成绘制一帧并且 GPU 用其他即将到来的帧覆盖帧缓冲区时,我们会在屏幕上看到第一帧的一部分和第二帧的一部分。这称为屏幕撕裂。
通常,不会发现这种情况发生。但假设这种情况发生了,屏幕将在多次刷新后显示相同的帧。从视觉的角度来看,用户不会看到任何差异。
VSync 使用称为双缓冲的机制解决了这个问题。 它是一种将帧率与显示硬件的刷新率同步的机制 。它规定在当前刷新周期完成之前,GPU 不会将任何新帧复制到帧缓冲区。
GPU 使用一个缓冲区来写入新帧。它称为后缓冲区,以前使用的帧缓冲区现在称为前缓冲区。所以规则是: “仅当显示硬件的当前刷新周期完成时,帧才会从后缓冲区移动到前缓冲区。”确保看到流畅的 UI。
在 Jelly Bean 4.1 的 android 中引入了垂直同步,在引入 Vsync 之前,输入、动画和绘图没有同步发生。当输入出现时,它被处理,当有动画或视图发生变化时,然后处理它,这导致过多的 CPU 操作,当有一些动画正在进行时,很难处理输入事件。
VSync 是 android Linux 内核以固定间隔定期发布的事件,其中输入处理、动画和窗口绘制以标准顺序同步发生。举个例子, VSync 信号以 16.66 ms 的间隔传送,相当于 60fps。输入处理、动画和窗口绘制在此信号到达时发生 。如果输入事件在 VSync 信号之前到达,它们将被排队 ,在动画完成, UI 重绘完成后在处理它。
Choreographer只是一个抽象,从较低的子系统接收定时脉冲(Vsync)并将命令传递给较高的子系统以渲染即将到来的帧。 每个具有 looper 的线程都会有一个单独的 Choreographer 实例。每个 HandlerThread 实例也会有它自己的 Choreographer。
Choreographer 类有一个回调 onVsync() 来处理 Vsync 信号。
vsync是指什么?
是垂直同步(Vsync,Vertical Sync),是一个视频卡的渲染选项。此选项防止视频卡更改显示内存,直到监视器完成当前刷新周期。当应用垂直同步时,如果生成的帧速率高于监视器的刷新率,则呈现引擎将匹配监视器的最大刷新率。
垂直同步将图形卡的输出视频同步到监视器的刷新率。当应用于帧速率明显高于监视器刷新率的应用程序时,这可能是很好的,因为这可以缓解图像撕裂,并导致流畅的回放。虽然如果显卡输出的帧速率明显低于监视器的刷新率,这可能导致视频输出抖动,因为显卡可能会错过监视器的刷新率截止日期。
使用VSync不需要特定的监视器。它的设计可以与各种显示器兼容。你需要一个显卡来支持它,但这对大多数游戏显示器来说都不是问题,甚至对更老的型号也不例外:VSync已经存在很多年了,英伟达和AMD都有设置选项。只要你有一个Nvidia或AMD GPU不是十年,你应该能够使用VSync。
然而,游戏并不需要自动启用VSync选项。你还需要进入游戏的设置并确保同步选项是打开的:这并不能保证会有很大的不同,但检查并确保这一点是很好的。最受欢迎的游戏都有它的选项,包括Fortnite, GTA V, Minecraft, Overwatch等等。
请问Vsync是什么意思?
等待垂直同步的意思。
垂直同步工作原理
显示器上的所有图像都是一线一线的扫描上去的,无论是隔行扫描还是逐行扫描,显示器,都有2种同步参数——水平同步和垂直同步。
垂直同步的作用:
简单来说垂直同步的作用是防止画面撕裂。因为画面的渲染不是整个画面一起渲染的,是逐行或者逐列渲染。如果关闭垂直同步,而电脑配置不够,则画面在高速移动中会出现这一画面还没渲染完成就开始下一画面的撕裂情况。
扩展资料:
检测器
垂直同步脉冲检测器10包括不回卷正反计数器14和比较器18,计数器14以采样频率对复合同步信号电平采样。
当计数器14的数字输出上升到第一基准计数以上时比较器18引发垂直同步检测脉冲,而当计数器14的数字输出下降到第二基准计数以下时结束垂直同步检测脉冲。
供给比较器18的基准数是随时依每个垂直同步检测脉冲的引发和结束而改变的。脉冲整形电路可以包括用来对比较器18的输出采样并产生垂直同步信号的锁存器22。
正是因为垂直同步的存在,才能使得游戏进程和显示器刷新率同步,使得画面平滑,使得画面稳定。取消了垂直同步信号,固然可以换来更快的速度,但是在图像的连续性上,性能势必打折扣。
参考资料来源:百度百科-垂直同步
vsync是很多人头疼的问题,尤其是在理解和现实的冲突方面,vsynccount也同样面临着相似的问题,关注我们,为您服务,是我们的荣幸!