Unity游戏画面参数解析与应用:垂直同步、动态模糊、抗锯齿

前言

最近会在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更昂贵。它是桌面和控制台平台的理想选择

3、关于抗锯齿的选择

那么对于抗锯齿来说,通常是为了解决低分辨率下的边缘成像锯齿问题,而如果你的游戏分辨率已经开的足够高,开启抗锯齿在提升画面质量相当有限的同时反而会消耗更多的显卡运算资源。简单的来说,画面越好,抗锯齿带来的收益会越低,如果你的显卡性能表现在高分辨率下压力较大,可以优先考虑关闭或调低抗锯齿选项

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心之凌儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值