从屏幕刷新频率到Unity VSync

摘要:
显示器有一个称为屏幕刷新率的属性,它是指每秒刷新屏幕的次数,单位为Hz。通常设置为60Hz。首先,为什么需要VSync。撕裂问题的解决方案是VSync。如前所述,屏幕刷新的两帧之间会有一个VBlank,间隔硬件会生成一个VSync信号。游戏只有在收到信号后才能计算下一帧,以避免撕裂。关闭VSync的优点是它可以更快地响应输入。Unity在QualitySettings中有一个VSyncCount属性来设置VSync,即Don't Sync、EveryVBrank和EverySecondVBrank。

显示器有一个属性叫屏幕刷新频率,它是指每秒刷新屏幕的次数,单位为Hz,一般设置为60Hz。

从屏幕刷新频率到Unity VSync第1张

什么是刷新屏幕呢?我们屏幕是由像素矩阵组成的,其(CRT)显示图像的原理是靠电子束从左到右、从上到下逐行激发屏幕内表面的荧光粉单元(像素)来实现的。电子束一次水平方向的扫描叫行扫描,一次完整的扫描就是刷新屏幕,形成的图像就是一帧。因此60Hz的刷新率也就是每秒60帧,人眼的视觉暂留需要满足每秒24帧及以上。

显示器扫描的过程中有两个重要的概念:HBlank(行消隐)和VBlank(场消隐)。HBlank是指当行扫描到最右端时需要快速返回到下一行的最左端的过程。而VBlank则是指扫描完一帧,准备开始扫描下一帧,扫描线从右下角返回到左上角的过程。这两个过程的时间间隔中,扫描线需要变得blank,以防止看到一条斜线显示在屏幕上。

游戏渲染中的VSync(垂直同步)技术就与刷新率和VBlank有关。先说说为什么需要VSync。一般情况下CPU执行游戏逻辑和GPU执行渲染的计算都会快于屏幕的刷新,也就是CPU提交渲染数据和命令到GPU、GPU填充渲染结果到显存的速度会快于屏幕刷新,因此当屏幕刷新进行的过程中很可能会出现显存内容被改变的情况,从而造成Tearing(画面撕裂)。

从屏幕刷新频率到Unity VSync第2张

解决Tearing问题的方案就是VSync。前面提到屏幕刷新的两帧之间会有一个VBlank,这个间隔硬件就会产生一个VSync的信号,游戏可以在只有收到该信号后再去计算下一帧,这样就能避免Tearing。实际上,即使在不使用VSync且不会发生Tearing的情况下,由于屏幕刷新率的限制,CPU/GPU的帧率再快对于渲染结果来说并没有影响,反而是一种冗余计算的浪费。而关闭VSync的好处是可以更快的响应输入。

Unity在Quality Settings中有个VSync Count属性可以设置VSync,分别是Don’t Sync(关闭VSync)、Every VBlank(每个VBlank计算一帧)、Every Second VBlank(每两个VBlank计算一帧)。 https://docs.unity3d.com/Manual/class-QualitySettings.html

从屏幕刷新频率到Unity VSync第3张

从屏幕刷新频率到Unity VSync第4张

VSync是需要图形API(DirectX、OpenGL)支持的,Unity对于关闭了VSync或者VSync的设置不被支持的情况采用了在CPU上同步的方案来维持目标帧率:

从屏幕刷新频率到Unity VSync第5张

void TimeManager::Sync (float framerate)中传入目标帧率framerate,函数中通过Sleep和循环来控制每帧的耗时,从而控制帧率。

免责声明:文章转载自《从屏幕刷新频率到Unity VSync》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle 数据库备份 cmd 命令老vue项目webpack3升级到webpack5全过程记录(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity资源内存管理--webstream控制

一 使用前提 1,需要使用资源热更新 2,使用Assetbundle资源热更(AssetBundle是产生webstream的元凶) 二 为什么要用AssetBundle AssetBundle本质上就是一个压缩算法,只不过比起zip等一些压缩多了一些信息,比如平台信息(Ios,android),依赖信息等,既然是压缩,那就很好理解了,AssetBundl...

【WPF学习】第五十二章 动画性能

  通常,为用户界面应用动画只不过是创建并配置正确的动画和故事板对象。但在其他情况下,特别是同时发生多个动画时,可能需要更加关注性能。特定的效果更可能导致这些问题——例如,那些涉及视频、大位图以及多层透明等的效果通常需要占用更多CPU开销。如果不谨慎实现这类效果,运行它们使可能造成明显抖动,或者会从其他同时运行的应用程序抢占CPU时间。   幸运的是,WP...

(转)Unity内建图标列表

用法 Gizmos.DrawIcon(transform.position, "PointLight Gizmo"); UnityEditor.EditorGUIUtility.FindTexture("PointLight Gizmo"); Unity Editor Built-in Icons Icons what can load usingE...

Unity使用外部版本控制SVN

原地址:http://www.cnblogs.com/realtimepixels/p/3652146.html Using External Version Control Systems with Unity Unity offers anAsset Serveradd-on product for easy integrated versioning...

使用AVPro Video在Unity中播放开场视频(CG)笔记

游戏需要添加开场CG,调研在Unity中播放视频,采用的插件为AVPro Video,Unity版本为2018.4.0f1 Asset Store:AVPro Video - Core Android Edition 官方文档:https://www.renderheads.com/content/docs/AVProVideo/articles/intr...

Unity中的半透明阴影

在Unity中渲染半透明阴影可以使用Unity提供的dither texture。在这之前,先考虑一般半透明物体的渲染流程: 设置render queue为Transparent,这样不透明的物体会先渲染,然后位于被不透明物体遮挡的透明物体就可以不必渲染,减少开销 设置render type为Transparent,便于一些replacement操作 设...