帧率和刷新率 VSync

帧率和刷新率 VSync,第1张

帧率是衡量单个图像(称为帧)在屏幕上显示速度的指标。所有视频实际上都是快速显示的一系列。当人眼看到这些图像快速变化时,它会将其解释为运动。 帧速率通常以 FPS 或每秒帧数表示。显然,帧率越高,每秒出现在屏幕上的图像就越多。更多的帧意味着更多的细节,所以在更高的帧速率下运动看起来更流畅。

刷新率是指屏幕更新其显示图像的次数。在 CRT(阴极射线管)显示器的旧时代,这是显示器内的电子q在屏幕上绘制新图像的次数。低刷新率会导致恼人的闪烁,即当您的眼睛注意到帧之间的亮度变化时。刷新率通常以赫兹 (Hz) 表示。您今天可以买到的几乎所有显示器的刷新率都至少为 60Hz。不过,可以使用更高刷新率的显示器,并且通常用于游戏。

帧率和刷新率的区别:帧速率是计算机、视频游戏控制台、视频播放器或其他设备每秒发送到显示器的图像数量。同时,刷新率是显示器实际显示这些帧的速度。

从逻辑上讲,这意味着 GPU 生成帧的速率高于显示硬件可以消耗的速率。当显视器在屏幕上显示任何内容时,它会从称为帧缓冲区的内存区域读取帧。当显示硬件尚未完成绘制一帧并且 GPU 用其他即将到来的帧覆盖帧缓冲区时,我们会在屏幕上看到第一帧的一部分和第二帧的一部分。这称为屏幕撕裂。

通常,不会发现这种情况发生。但假设这种情况发生了,屏幕将在多次刷新后显示相同的帧。从视觉的角度来看,用户不会看到任何差异。

VSync 使用称为双缓冲的机制解决了这个问题。 它是一种将帧率与显示硬件的刷新率同步的机制 。它规定在当前刷新周期完成之前,GPU 不会将任何新帧复制到帧缓冲区。

GPU 使用一个缓冲区来写入新帧。它称为后缓冲区,以前使用的帧缓冲区现在称为前缓冲区。所以规则是: “仅当显示硬件的当前刷新周期完成时,帧才会从后缓冲区移动到前缓冲区。”确保看到流畅的 UI。

在 Jelly Bean 41 的 android 中引入了垂直同步,在引入 Vsync 之前,输入、动画和绘图没有同步发生。当输入出现时,它被处理,当有动画或视图发生变化时,然后处理它,这导致过多的 CPU *** 作,当有一些动画正在进行时,很难处理输入事件。

VSync 是 android Linux 内核以固定间隔定期发布的事件,其中输入处理、动画和窗口绘制以标准顺序同步发生。举个例子, VSync 信号以 1666 ms 的间隔传送,相当于 60fps。输入处理、动画和窗口绘制在此信号到达时发生 。如果输入事件在 VSync 信号之前到达,它们将被排队 ,在动画完成, UI 重绘完成后在处理它。

Choreographer只是一个抽象,从较低的子系统接收定时脉冲(Vsync)并将命令传递给较高的子系统以渲染即将到来的帧。 每个具有 looper 的线程都会有一个单独的 Choreographer 实例。每个 HandlerThread 实例也会有它自己的 Choreographer。

Choreographer 类有一个回调 onVsync() 来处理 Vsync 信号。

等待垂直同步的意思。

垂直同步工作原理

显示器上的所有图像都是一线一线的扫描上去的,无论是隔行扫描还是逐行扫描,显示器,都有2种同步参数——水平同步和垂直同步。

垂直同步的作用:

简单来说垂直同步的作用是防止画面撕裂。因为画面的渲染不是整个画面一起渲染的,是逐行或者逐列渲染。如果关闭垂直同步,而电脑配置不够,则画面在高速移动中会出现这一画面还没渲染完成就开始下一画面的撕裂情况。

扩展资料:

检测器

垂直同步脉冲检测器10包括不回卷正反计数器14和比较器18,计数器14以采样频率对复合同步信号电平采样。

当计数器14的数字输出上升到第一基准计数以上时比较器18引发垂直同步检测脉冲,而当计数器14的数字输出下降到第二基准计数以下时结束垂直同步检测脉冲。

供给比较器18的基准数是随时依每个垂直同步检测脉冲的引发和结束而改变的。脉冲整形电路可以包括用来对比较器18的输出采样并产生垂直同步信号的锁存器22。

正是因为垂直同步的存在,才能使得游戏进程和显示器刷新率同步,使得画面平滑,使得画面稳定。取消了垂直同步信号,固然可以换来更快的速度,但是在图像的连续性上,性能势必打折扣。

参考资料来源:百度百科-垂直同步

在Android41之后增加了Choreographer机制,用于同Vsync机制配合,统一动画、输入和绘制时机。本文以绘制为例来简单学习下Choreographer。

ViewRootImpl的requestLayout开启绘制流程:

这里主要关注两点:

postSyncBarrier : Handler 的同步屏障。它的作用是可以拦截 Looper 对同步消息的获取和分发,加入同步屏障之后,Looper 只会获取和处理异步消息,如果没有异步消息那么就会进入阻塞状态。也就是说,对View绘制渲染的处理 *** 作可以优先处理(设置为异步消息)。

Choreographer : 编舞者。统一动画、输入和绘制时机。也是这章需要重点分析的内容。

frameworks\base\core\java\android\view\Choreographerjava

每一个Looper线程都有自己的Choreographer,其他线程发送的回调只能运行在对应Choreographer所属的Looper线程上

Choreographer类中有一个Looper和一个FrameHandler变量。变量USE_VSYNC用于表示系统是否是用了Vsync同步机制,该值是通过读取系统属性debugchoreographervsync来获取的。如果系统使用了Vsync同步机制,则创建一个FrameDisplayEventReceiver对象用于请求并接收Vsync事件,最后Choreographer创建了一个大小为3的CallbackQueue队列数组,用于保存不同类型的Callback。

这里,不同类型的Callback包括如下4种:

CallbackQueue是一个容量为4的数组,每一个元素作为头指针,引出对应类型的链表,4种事件就是通过这4个链表来维护的。

而FrameHandler中主要处理三类消息:

Choreographer提供了两类添加回调的方式:postCallback 与 postFrameCallback,当然对应类型也包含delay的方法,算上其实有4个方法。

postCallback对应的:

postFrameCallback对应的:

相比之下postCallback更灵活一点。两者最终都会调到:postCallbackDelayedInternal

mCallbackQueues先把对应的callback添加到链表上来,然后判断是否有延迟,如果没有则会马上执行scheduleFrameLocked,如果有,则发送一个what为MSG_DO_SCHEDULE_CALLBACK类型的定时消息,等时间到了再处理,其最终处理也是执行scheduleFrameLocked(long now)方法。

这里首先判断USE_VSYNC,如果使用了VSYNC:走scheduleVsyncLocked,即请求VSYNC信号,最终调用doFrame,如果没使用VSYNC,则通过消息执行doFrame。

那么我们先简单了解下请求VSYNC信号的流程:

mDisplayEventReceiver 对应的是FrameDisplayEventReceiver,它继承自 DisplayEventReceiver , 主要是用来接收同步脉冲信号 VSYNC。scheduleVsync()方法通过底层nativeScheduleVsync()向SurfaceFlinger 服务注册,即在下一次脉冲接收后会调用 DisplayEventReceiver的dispatchVsync()方法。这里类似于订阅者模式,但是每次调用nativeScheduleVsync()方法都有且只有一次dispatchVsync()方法回调。

然后再看看接收VSYNC信号:

底层向应用层发送VSYNC信号,java层通过dispatchVsync()接收,最后回调在FrameDisplayEventReceiver的onVsync

可见onVsync()过程是通过FrameHandler向主线程Looper发送了一个自带callback的消息 callback为FrameDisplayEventReceiver。 当主线程Looper执行到该消息时,则调用FrameDisplayEventReceiverrun()方法,紧接着便是调用doFrame。

当Vsync事件到来时,顺序执行4种事件对应CallbackQueue队列中注册的回调。

按时间顺序先后执行CallbackRecord对应的run方法

接开篇讲的

mTraversalRunnable对应:

run方法被执行,所以doTraversal()被执行,开启View的绘制流程。

所以整个绘制过程总的流程如下所示:

简单总结:

参考

>

帧的渲染过程中一些关键组件的流程图

任何可以产生图形信息的组件都统称为图像的生产者,比如OpenGL ES, Canvas 2D, 和 媒体解码器等。

SurfaceFlinger是最常见的图像消费者,Window Manager将图形信息收集起来提供给SurfaceFlinger,SurfaceFlinger接受后经过合成再把图形信息传递给显示器。同时,SurfaceFlinger也是唯一一个能够改变显示器内容的服务。SurfaceFlinger使用OpenGL和Hardware Composer来生成surface

某些OpenGL ES 应用同样也能够充当图像消费者,比如相机可以直接使用相机的预览界面图像流,一些非GL应用也可以是消费者,比如ImageReader 类。

Window Manager是一个用于控制window的系统服务,包含一系列的View。每个Window都会有一个surface,Window Manager会监视window的许多信息,比如生命周期、输入和焦点事件、屏幕方向、转换、动画、位置、转换、z-order等,然后将这些信息(统称window metadata)发送给SurfaceFlinger,这样,SurfaceFlinger就能将window metadata合成为显示器上的surface。

为硬件抽象层(HAL)的子系统。SurfaceFlinger可以将某些合成工作委托给Hardware Composer,从而减轻OpenGL和GPU的工作。此时,SurfaceFlinger扮演的是另一个OpenGL ES客户端,当SurfaceFlinger将一个缓冲区或两个缓冲区合成到第三个缓冲区时,它使用的是OpenGL ES。这种方式会比GPU更为高效。

一般应用开发都要将UI数据使用Activity这个载体去展示,典型的Activity显示流程为:

一般app而言,在任何屏幕上起码有三个layer:

那么android是如何使用这两种合成机制的呢?这里就是Hardware Composer的功劳。处理流程为:

借用google一张图说明,可以将上面讲的很多概念展现,很清晰。地址位于 >

以上就是关于帧率和刷新率 VSync全部的内容,包括:帧率和刷新率 VSync、请问Vsync是什么意思、Android图形系统(十一)-Choreographer等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9287453.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存