unity游戏画面参数解析与应用:垂直同步动态模糊抗锯齿(代码片段)

心之凌儿 心之凌儿     2023-02-22     544

关键词:

前言

最近会在B站刷到一些关于

等等这样关于画面与性能调整的的视频,看完之后受益良多,UP主们经过实际测试获取到宝贵的游戏画面对于性能表现影响的数据,可以很好的帮助到游戏爱好者对游戏画面参数的调教

对于一个游戏开发者而言,通过这样的视频也可以了解到一些影响到游戏性能的一些关键点,还是推荐大家看看的

好巧不巧,在此之后,又看到了大学同学在群里分享了一张关于原神画面设置的图片,具体如下图所示,根据他的参数设置来看,由于笔记本配置比较高,所以直接把所有的参数调整到比较高的一个状态。根据这个案例可以很明显的看出,游戏厂商有时设置的一些参数不一定会被玩家所理解,从人类的思维方式来说也是,如果我不了解这些参数,就会认为高了比低了好,打开比关闭表现好

但是垂直同步、动态模糊、抗锯齿这些参数是用来解决一定场景下的负面参数的,并不就是打开就一定要比关闭好

所以对于一个游戏开发者而言,就需要对这些参数有一定的敏感度。这篇文章就简单的分析一下关于游戏画面参数相关内容。首先通过我的直观感受,大概的将这些参数分为三个方面:

  • 用来权衡画面与性能表现,如分辨率、渲染精度、渲染质量、场景细节等等
  • 解决特定情况下的画面的负面效果,比如垂直同步、动态模糊、抗锯齿等
  • 增强视觉效果的特定技术,如体积雾、反射、Bloom

第一类与第三类可以很直观的去理解,所以就不多介绍了,这里就主要说一下第二类的参数相关的内容

一、 垂直同步:

显示器在刷新画面时,会逐行扫描屏幕像素,这些水平扫描线在垂直方向的堆积就形成了完整的画面,而这些画面的信息来自于显卡输出的每帧画面信息

简单的来说,整个画面的输出工作流程为,在显卡渲染完成后,输出一帧的画面信息到某一缓存区域,而当下一游戏帧画面完成后,会直接替换掉缓存区域的信息,而显示器的画面输出则是与屏幕刷新率有关,并且显示器相对于显卡而言,对于画面的信息处理是一个过程变化,即显示器在一定的时间间隔内从上到下一行一行读取显卡缓存的画面信息

由于这样的工作流程,当游戏帧数大于屏幕的刷新率的时候,就容易出现这样的一个问题,即显示器一个画面未刷新完成时,缓存区域内缓存画面信息却变为了下一帧的内容。那么显示器剩余的画面信息读取的就是下一帧的信息,这样最后的显示器最后的画面就是由两帧或者多帧画面组合而成,而在这一过程,若游戏镜头移动的过快,导致显卡输出的两帧画面的信息差异较大,就会在显示器上显示出截断的画面

垂直同步如何解决两者差异:

首先同步百度百科的解释来说明垂直同步的一些基本信息:垂直同步又称场同步(Vertical synchronization),从CRT显示器的显示原理来看,单个像素组成了水平扫描线,水平扫描线在垂直方向的堆积形成了完整的画面。显示器的刷新率受显卡DAC控制,显卡DAC完成一帧的扫描后就会产生一个垂直同步信号。我们平时所说的打开垂直同步指的是将该信号送入显卡3D图形处理部分,从而让显卡在生成3D图形时受垂直同步信号的制约

在Unity中,如果想要开启垂直同步,可以在Quality下面找到Vsync Count,而关于其对应的三个选项分别为:

  • Don't Sync:不需要垂直同步
  • Every V Blank:开启垂直同步
  • Every Second V Blank:每隔一个垂直空白同步

也可以直接通过脚本中的API来直接控制:

public static int vSyncCount ;

而关于这一选项的具体的含义,可以根据Unity文档中介绍来了解到其应在每帧之间传递的垂直同步数。使用'Don't Sync' (0)则不等待垂直同步。 值必须为 0、1、2、3 或 4

二、动态模糊

我们日常接触的电影的帧数大多都是24帧左右,但是给我们的感觉却是非常的流畅,而电子游戏的帧数就算达到了四五十帧也会有一定的卡顿感,这是为什么呢

游戏动态模糊由来

这要从两者的画面呈现原理说起,在我们拍摄电影时,每一帧的画面记录的信息是一帧曝光时间段内记录的信息,如果在这段曝光时间内画面内的物体发生了位移,那么在镜头内占据的像素信息也是变化的。简单的举个例子,我们在拍摄一张运动场景的图片时,会发现画面是连贯性模糊的,比如这张我拍的北京五环的夜景照片,可以看到运动的汽车产生了明显的模糊效果:


同样对于电影而言,每一帧画面的信息也是记录一段时间的信息,简单的验证,当我们看到电影中快速移动的镜头时,如果按下暂停,就会发现画面是非常模糊的,如图所示:

出现这种运动模糊的情况是,相机的快门不是瞬时的,而是与曝光时间有关,会持续的接受进来的光的信息,而随着时间的流逝,对于运动的物体来说,传入相机传感器的信息会持续改变并叠加而产生模糊的效果,那么根据相机的成像原理来说,是不是画面曝光时间足够短的话就可以得到清晰的画面呢,答案是否定的,如果缩短曝光时间,可能就会造成进光量不足,而无法获取足够的环境信息

为什么这种模糊的画面可以给人流畅的感觉呢,这是因为人的大脑在处理这些模糊的画面时,会自动的进行画面的修正而产生视觉暂留的效果,从而联想到前后的画面,组合成连贯的画面。

与相机的成像过程稍微不同的是,游戏里面的每一帧画面都是通过计算机实时计算出来的结果,而一帧里面的画面信息代表某一瞬间计算处的画面信息,因此如果场景相机前后两帧位置变化较大,画面信息就会产生明显的差异,而给玩家卡顿的感觉

为了提升低性能设备的游戏体验,尤其是FPS游戏,会给玩家提供动态模糊的选项,利用动态模糊的视觉原理尝试减少游戏的卡顿感,不过也有一些赛车游戏会通过动态模糊这种方式来提升游戏的真实沉浸感与速度感

Unity实现方式:
关于动态模糊的游戏内实现原理,我尝试去搜索了解一下,其主要是基于前后帧中运动矢量的一个,而运动矢量这个概念与视频编码相关的知识,也有大量的数学知识出现,确实超出我的理解。这里简单的从应用层面来介绍,在Unity提供的后处理方案中,可以添加Motion Blur作为后处理的动态模糊解决方案

其三个关键参数为:

  • Quality:设置效果的质量。较低的预设可提供更好的性能,但视觉质量较低。
  • Instensity:将运动模糊滤镜的强度设置为 0 到 1 之间的值。值越高,模糊效果越强,但会导致性能降低,具体取决于Clamp参数。
  • Clamp:设置由相机旋转产生的速度可以具有的最大长度。这限制了高速下的模糊,以避免过度的性能成本。该值是作为屏幕全分辨率的一部分进行测量的,值范围是 0 到 0.2。默认值为 0.05

三、 抗锯齿

打开一张图片,然后无线的放大,直到可以看到图片的每一个像素颜色,就会发现基本的像素单元是由一个个方格组成的,如图所示:

而这些像素块通过不同的颜色值最终组成一张丰富多彩的图片,但是由于在微观上层面方块上无法绘制处完美斜线,所以会在宏观层面出现一些突出的锯齿状的现实效果,如下图所示:

很显然,这种显示效果对于游戏画面而言是非常不好的,尤其在色彩对比度比较强的区域,为了尽可能的减轻该效果,就需要一定的手段去干预解决。对于玩家而言,最直接有效的方式就是增大游戏的分辨率,而在技术手段方面,可以通过抗锯齿来柔化边缘场景的外观,来减小突出的不适观感

1、抗锯齿介绍:

抗锯齿可改善多边形边缘的外观,使它们不会产生“锯齿现象”,而是在屏幕上获得平滑的显示效果。但是,它会导致显卡的性能成本升高并使用更多的视频内存(尽管没有 CPU成本)。抗锯齿的程度决定了多边形边缘的平滑程度(以及消耗的视频内存量),目前已有的抗锯齿解决方案有很多,下面列举几个与Unity解决方案相关抗锯齿方案,这里的内容介绍直接参考百度百科的描述:

超级采样抗锯齿(SSAA):

超级采样抗锯齿先把图像映射到缓存并把它放大,再用超级采样把放大后的图像像素进行采样,一般选取2个或4个邻近像素,把这些采样混合起来后,生成的最终像素,令每个像素拥有邻近像素的特征,通过这一步的处理,像素与像素之间的过渡色彩,就变得近似,图形的边缘色彩过渡趋于平滑。再把最终像素还原回原来大小的图像,并保存到帧缓存也就是显存中,替代原图像存储起来,最后输出到显示器,显示出一帧画面,整个过程的变化演示过程为:


整个过程的处理就等于,将图片成倍放大后逐像素色彩混合,得到一张模糊的色彩平滑的大图,然后把这幅模糊的大图,通过细腻化后再缩小成清晰的小图。如果每帧都进行抗锯齿处理,游戏或视频中的所有画面都带有抗锯齿效果。而将图像映射到缓存并把它放大时,放大的倍数被用于分别抗锯齿的效果,即我们通常所说的2x4x8x就是指的图片的放大倍数。 超级采样抗锯齿中使用的采样法一般有两种:

  • 顺序栅格超级采样,采样时选取2个邻近像素
  • 旋转栅格超级采样,采样时选取4个邻近像素

2、Unity中设置抗锯齿

Unity中针对不同的平台或不同性能的游戏设备,提供了多种不同技术方案的抗锯齿选项,大概可以分为下面两类:

  • 硬件设备抗锯齿:多重采样抗锯齿(MSAA
  • 后处理抗锯齿:快速近似抗锯齿 (FXAA)、子像素增强抗锯齿(SMAA)、时间抗锯齿 (TAA)

下面简单列举一下各个抗锯齿解决方案的简单解释,内容来源百度百科与Unity文档:

硬件设备抗锯齿:

多重采样抗锯齿(MSAA):

多重采样抗锯齿是一种特殊的超级采样抗锯齿,该技术来自于OpenGL。具体是MSAA只对深度缓存(Z-Buffer)和模板缓存(G-Buffer)中的数据进行超级采样抗锯齿的处理。通过深度缓存可以获取到物体的边缘信息,这样就可以只对多边形的边缘进行抗锯齿处理。相比SSAA对画面中所有数据进行处理,MSAA对资源的消耗需求大大减弱,不过在画质上可能稍有不如SSAA

Unity引擎中,默认支持的抗锯齿方案就是MSAA,可以在质量设置中找到该选项:


注意,在Unity中将URP作为渲染管线时,该选项被移动到URP对应的配置文件中的Quality中,如果是在项目初始创建时,选择直接创建URP模板,可以在Assets/Setting中找到该配置文件

同时对于MSAA而言,其不可在延迟渲染中使用,所以在Unity的默认设置中,仅仅考虑在前向渲染中应用该选项

后处理抗锯齿:

Unity中的后处理抗锯齿提供一下抗锯齿模式:

  • 快速近似抗锯齿(FXAA);适用于不支持运动矢量的移动设备和平台的快速算法。
  • 子像素增强抗锯齿(SMAA);适用于不支持运动矢量的移动设备和平台的高质量但速度较慢的算法。
  • 时间抗锯齿(TAA);一种需要运动矢量的高级技术。桌面和控制台平台的理想选择。

如果是在URP模板下,你可以在Camera中看到抗锯齿的选项,其默认选项为FXAA,即快速近似抗锯齿,如图所示:

如果是默认渲染管线的情况下,就需要通过Post-process Layer来为每一个相机单独设置其抗锯齿模式,如图所示:

下面简单的粘贴过来Unity文档对三者的一些基本的介绍:

  • 快速近似抗锯齿(FXAA): FXAA 是基于MSAA的一种高性能近似值,是一种单线程的像素着色器是最有效的抗锯齿技术,非常适用于不支持运动矢量的移动平台和其他平台

  • 子像素增强抗锯齿(SMAA):相比于FXAA而言,SMAA的抗锯齿效果的质量更好,但是同时也更加消耗性能

  • 时间抗锯齿 (TAA):TAA是一种先进的抗锯齿技术,其中帧在历史缓冲区中随时间累积,用于更有效地平滑边缘。它在平滑运动边缘方面要好得多,但需要运动矢量并且比FXAA更昂贵。它是桌面和控制台平台的理想选择

unity打android包不卡,但是在打ios包后卡

...果设置为-1,表示以最快速度运行)记得这个东西和Unity垂直同步的操作有关系,如果设置了垂直同步,那么Unity就会放弃这个设定,而是根据屏幕硬件的刷新速度来运行如果设置垂直同步为1,则帧率为60帧如果垂直同步设置为2... 查看详情

unity安卓关闭垂直同步

参考技术Aunity安卓在设置里关闭垂直同步。安卓是一种基于Linux内核的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。 查看详情

游戏开发中——垂直同步绘制效率显示器刷新频率与帧率

【转】:here 从后缓存到显示器      最近在看D3D的架构,在这过程中对帧率这个一直认为很简单的东西有了更多的理解。在过去看来,帧率就是显卡渲染一帧所用时间的倒数,现在看来远远不是这个样子... 查看详情

Unity:在专用服务器上通过网络进行旋转同步

...但我似乎无法在任何地方找到答案。我有一个用C#控制台应用程序编写的太空游戏专用服务器。我面临的问题是游戏对象旋转的同步。我怀疑这个问题与云台锁定有关,但我不确定。这里有我的玩家移动/旋转控制器:publ 查看详情

为啥我的nvidia垂直同步里没怎么自适应

...项。找到垂直同步这一项,选择开启,最后在右下方单击应用即可。这样在玩游戏是就可消除画面撕裂现象。注意这里有自适应垂直同步,是根据当前帧数决定锁定帧数在30帧或60帧,不是每个人都能看到自适应垂直同步,前提... 查看详情

为啥我开了垂直同步玩游戏画面还是会撕裂,和不开没多大区别。

...中点击“添加”按钮,在下拉框中选择要使用独立显卡的应用程序;4、在第二条中的图形处理器中选择“高性能NVIDIA处理器”,然后点击右下方应用即可。参考技术A了解一下是啥游戏?难道没有独立显卡,这个intel的是CPU内置的... 查看详情

unity实战之见缝插针(代码片段)

...生成需要被插的针。3.针的移动。4.针的旋转(与转盘旋转同步)。5.游戏得分。6.游戏成功与失败的判断。圆盘的转动首先,我们先来实现圆盘的转动,可以直接使 查看详情

如何在 Unity 中将 Sprite Flip 与 Photon2 同步

】如何在Unity中将SpriteFlip与Photon2同步【英文标题】:HowtosyncSpriteFlipinUnitywithPhoton2【发布时间】:2019-03-0115:44:26【问题描述】:我正在尝试在多人2d游戏中同步精灵翻转,精灵在本地玩家身上翻转,但其他玩家看不到翻转。翻转... 查看详情

游戏开发者眼中的unity3d网页游戏测评报告

...方收集到可注册的Unity3D页游测试发现,当下的Unity3D技术应用尤其在国内正遭遇着尴尬而无奈的窘迫境地,原因为何?大伙不妨先看看其中7款游戏测试数据:《骑士的远征》(国产)类型:SLG模型与场景环境:低性能:一般下载... 查看详情

游戏开发小技unity通过ui全屏图来模糊场景画面(shader|模糊|滤镜|blur)(代码片段)

...,方便查阅。本文我要说的是在Unity中通过UI全屏图来模糊场景画面的效果。二、效果演示这是没用模糊效果的样子 查看详情

游戏开发小技unity通过ui全屏图来模糊场景画面(shader|模糊|滤镜|blur)(代码片段)

...,方便查阅。本文我要说的是在Unity中通过UI全屏图来模糊场景画面的效果。二、效果演示这是没用模糊效果的样子 查看详情

vsynccount垂直同步

...到VSync这一项占了很大的比重。这个是什么呢,这个就是垂直同步,稍后再做解释。我们可以关闭VSync来提高帧速率,选择edit->projects 查看详情

vsynccount垂直同步

...VSync这一项占了非常大的比重。这个是什么呢,这个就是垂直同步。稍后再做解释。我们能够关闭VSync来提高帧速率,选择edit->projectset 查看详情

unity3d游戏通用系统设置页面,自定义按键设置,背景虚化,图像设置,亮度对比度饱和度音量调节,分辨率窗口化,帧率垂直同步,抗锯齿,阴影质量,纹理质量设置(代码片段)

简易的游戏通用设置页面本文章包含所有代码及UI结构页面效果:UI结构(便于管理):代码:思路:整个页面的父物体SettingPanel上挂载管理代码,用于获取设置页面中所有的功能按钮,拖动条,下拉框等,做一个单例以便其他Panel获取.有三个... 查看详情

将 open gl 与应用程序代码同步

】将opengl与应用程序代码同步【英文标题】:Syncingopenglwithapplicationcode【发布时间】:2015-01-0213:27:34【问题描述】:我正在使用c/c++(NDK)在android上使用opengles2.0制作这个游戏作为游戏中最重要的东西,我为游戏循环制定了两个方案... 查看详情

使用 Photon Unity Network(多人游戏)在 Unity 中实时同步

】使用PhotonUnityNetwork(多人游戏)在Unity中实时同步【英文标题】:RealtimesyncinUnityusingPhotonUnityNetwork(multiplayer)【发布时间】:2020-03-0906:45:30【问题描述】:我正在做一个演示项目,我在其中使用Unity3D和PhotonUnity网络(PUN)进行实时... 查看详情

unity与oc交互

...代staticextern的函数,与C里面的函数同名。一.基础的调用参数,无传参ocClass.mmCsharpCallOC.cs二.传递参数ocClass.mmCsharpCallOC.cs三.OC回调Unity1.使用函数指针接口方法进行回调,可以传参,也可以带返回参数,调用灵活。(推荐使用)2.U... 查看详情

Unity 中的 AI 角色与 Photon View

...nity中构建一个小游戏。在添加AI之前,所有游戏对象都是同步的,但新的AI角色似乎由每个游戏实例单独控制。我遇到了一些与子弹类似的问题,但在这里我只是打开和关闭预制件的射击脚本,以实例化玩 查看详情