在超多面数的世界中做预算 | UnrealFest演讲精粹

科技   2024-12-11 17:13   上海  

前言

经常制作大型项目的开发者应该知道,我们通常需要花费大量时间精力去保证游戏能够流畅运行,这样的话就离不开一个叫"预算"的东西。比如这棵树我们能做多少面?这个场景能放多少敌人?等等这些问题都是我们在做实时项目时要考虑的。今天将会为大家分享由索尼团队技术总监Steve Walker带来的演讲“在大型场景中做预算”,视频链接:https://www.youtube.com/watch?v=q28KMKjUZkI

目录 

一、之前做预算的方式
二、现在做预算的方式
    2.1. GPU毫秒预算
    2.2. CPU毫秒预算            
    2.3. 内存预算            
    2.4. 硬盘空间预算            
三、考虑预算方式变复杂了            
四、灵魂三问            
    Q1:基于预算,我们可以实现哪些玩法?           
        Q1.1. 帧率            
        Q1.2. 分辨率            
        Q1.3. 虚幻引擎的技术            
    Q2:我们该怎么知道做出来的东西能不能跑?           
    Q3:我们怎么充分利用现有的技术?           
        Q3.1. 虚幻好在哪儿            
        Q3.2. 虚幻引擎里这些功能可能会消耗性能            
五、最后回顾
    

一、之前做预算的方式 

不同项目做预算的方式可能不同,这通常跟项目目标平台有关。根据Steve的经验来说,当我们聊到GPU的毫秒预算时,常常就会转变成面数预算,角色面数会有一个预算标准,场景面数也会有一个预算标准等等。还有CPU的毫秒预算,包括我们场景中物理物体的限制、射线检测的限制、角色多少的限制等等。别忘了载具,载具通常比较吃性能,所以最好也针对载具进行CPU优化。内存和硬盘储存也要考虑,这其中占大头的资产有纹理、模型、音频和视频,在必要时对这些类型的资产搞一搞压缩。我们也可以看看自己的项目之前是怎么做预算的,会不会和Steve一样。

二、现在做预算的方式 

2.1. GPU毫秒预算  

现在我们有着新的硬件平台与新的UE5。在GPU毫秒预算中,我们已经不需要在场景面数上做预算了,因为有了Nanite自动帮助我们处理画面细节与面数之间的平衡。不过我们还是得站在宏观的角度,结合游戏中的其他要素去分析如何优化GPU的时间消耗,比如考虑场景用途对光照与物体进行相关的参数调整,物体是否可移动,光照是否可移动,角色交互等等这些因素。    


2.2. CPU毫秒预算 

接下来是CPU毫秒预算。随着时代的发展,CPU的算力变得越来越好了,那我们还需要在预生产的时候考虑代码到底有没有得到很好的优化吗?这可能需要根据各自的游戏类型和目标帧率来进行判断了,有些游戏还是需要考虑CPU瓶颈问题的。比如一些FPS游戏,它们通常需要比较高的目标帧率和比较快的输入反应,所以需要在GPU与CPU时间优化上下大功夫。我们还得尽早了解到自己团队的能力是否足够支持我们制作性能很好又很好玩的游戏内容,如果确实在某个功能上做不到很好的优化,导致CPU瓶颈,就需要做出一些取舍了。并且我们还需要在开发过程中持续跟踪问题,保证游戏发售之前这个CPU问题已经得到良好的解决了。检查主线程,也可以说检查Tick触发的事件,检查物理线程和渲染线程是否消耗过高了。在渲染线程中的角色动画有可能会造成性能问题,如果您还没用上虚幻5的安全线程更新动画和动画层,现在就可以去了解一下,并开始用上它了。
   

2.3. 内存预算  

然后是内存预算。内存预算中比较重要的是固定内存,也就是主机和虚幻引擎固定占用的内存,主机需要一些内存作为其软件系统的内存缓冲区,虚幻引擎需要内存管理纹理流内存池和Nanite几何池。当固定内存确定下来之后,就是考虑还剩下什么游戏内容需要进行内存管理了。比如动画数据、骨架数据、非Nanite网格体、非流送纹理等,最好是在早期就知道还剩多少内存可供使用,平衡非固定内存中各部分的占用。如果技术能力足够其实都可以靠写代码解决问题,制定严格的流送与内存管理规则来优化非固定内存中各部分的占用,这就得看各自工作室的情况决定了。


2.4. 硬盘空间预算 

最后是硬盘空间预算。有着超级丰富细节的Nanite网格体和有着超级丰富细节的纹理,这些都会大量占用我们的硬盘空间。所以我们要在项目中考虑资产共享,关卡中对于各种模型资产的运用,用尽可能少的模型素材做丰富细节的场景。然后就是考虑是否做可下载内容了,对于一些网游来说,我们下载小的游戏本体就能玩,通过下载可选资源包来使用高细节内容。但是对于主机上的单机游戏来说,目标是为了能够离线得到最好的游戏体验,并且还能塞进几张光盘里,这也是需要权衡的。总体而言,硬盘空间占用需要尽早考虑,比如硬盘占用到底会不会成为游戏开发中的核心问题,游戏中有没有大量的独特场景和各种角色自定义等。尽可能减少硬盘占用是好事,但大多数情况没有很严格的限制。不过基本的开发习惯也需要具备,总不可能把一个高细节的素材放在一个玩家可能很难看得清的地方吧,既占用磁盘空间又消耗运行时性能。    

三、考虑预算方式变复杂了 

对,要考虑的项目变得复杂了,不然不至于现在的做预算讨论比之前的做预算讨论要长的多的多。现在简单用数字去做预算已经不准确了,比如场景限制100w面、角色耗时3毫秒、光照2毫秒等等。这些都是很死板的要求,我们需要从游戏开发宏观角度去看待问题,比如我们使用资产、灯光和各种引擎功能的方式,这些东西的使用加起来才是我们最终的消耗。有点像木桶效应,每一个板块都需要优化得当才能达到良好的游戏体验。所以我们应该问自己什么?我们又应该知道些什么?接下来就是游戏性能预算与游戏优化的灵魂三问了。

四、灵魂三问 

Q1:基于预算,我们可以实现哪些玩法? 

如果浅显地看这个问题,我们可以理解成在虚幻引擎中,我们该使用哪些开箱即用的功能。往深一些就是,我们该使用什么质量和类型的资产。所以我们引出这个游戏开发三角:设计、视觉质量、技术,我们将根据这三个因素选择我们需要开发的功能。假如我们现在有一个功能想放到游戏里,不妨将这个功能放在这个三角里,看看功能能否放在中间,如果能正好放在中间,就意味着这个功能非常适合放在我们的游戏当中。但其实对于游戏开发而言,最重要的还是设计,也就是放在三角顶部的这一环节,因为设计决定了游戏类型和玩家受众群体我们不能为了技术和视觉效果放弃设计,应该把性能预算用在玩家真正关心的地方。


Q1.1. 帧率 

60帧依旧很难达到,对于每一代游戏主机而言都是如此,因为我们都希望得到新时代质量的东西,希望渲染出更精细的画面(虽然说图中是GPU毫秒,但是对于CPU来说也是如此)。    
所以帧率目标是影响做预算的重要因素之一,并且尽早将帧率目标决定好,帧率目标将会影响整个团队的工作。假如团队的帧率目标决定了是电影级画质的60帧,团队中各个部门的工作就必须围绕这个目标进行,音效、游戏逻辑、渲染等等部门都将朝着这一目标前进。
除了帧率,我们还需要关心玩家与游戏世界的交互以及对速度的感知,并且希望游戏能够有及时的反馈与沉浸感,也就是玩家口中相传的“手感”。比如赛车游戏有较高的输入延迟和显示延迟的话,虽然大脑会有纠正,但是玩家就会觉得这游戏玩得不舒服、不好玩、老是撞车等。使用r.GTSyncType这个控制台指令可以调整输入延迟同步模式。    
                 

 

Q1.2. 分辨率 

我们可能不需要原生4K,而且也可能做不到。我们应该在较低分辨率下花更多精力与时间在像素质量上,然后再考虑升级分辨率。玩家对于游戏质量的体验更多来自于延迟、像素质量和画面稳定性这几个要素。所以我们该思考我们的游戏应该能在画面好看的前提下升级到什么分辨率,而不是一开始就决定好要达到一个很高目标的分辨率。可以找多一些人用一段移动的场景环境做测试,看看不同分辨率下的同一个移动场景,在感受上有什么不同。为了探讨分辨率优化问题,不妨了解一下虚幻引擎中的中间分辨率和动态分辨率提升,比如FSR、TSR、DLSS等。
这张图来自虚幻文档,幻灯片中标记了很多关于Steve在项目中调整分辨率所使用的参数,我们自己的项目可以使用自己探索出来的最佳参数。虚幻引擎处理分辨率大约有三个阶段,首先会先渲染3D世界场景,通过TSR或者其他一些分辨率放大技术进入第二阶段。第二阶段处理动态模糊、辉光和色调映射。最后通过空间放大到最终分辨率,用来渲染UI并最终输出画面。我们现在反着看这个处理流程,假如我们需要最终输出4k分辨率,我们会使用90%反算出空间放大前分辨率,然后再使用65%反算出TSR放大前的分辨率。最终3D世界的渲染只需要在1080到1263分辨率之间,这个渲染分辨率可能会根据帧率目标上下浮动,甚至掉到1080以下,输出出来的画面可能会糊。在开发过程中最好关闭这个功能,因为相较于掉分辨率,掉帧更容易让人察觉到,更容易让人不舒服。假如动态分辨率的最大屏幕百分比调的比较大,会占用更多内存用于屏幕缓冲区,如果在处理内存预算就需要注意这一点。在Steve的情况中TSR不处理历史缓冲区的,这样可以降低性能消耗。    


Q1.3. 虚幻引擎的技术 

Epic说虚幻的功能是一个工具箱,我们可能选择使用或者不使用某一些技术。但对于Steve而言,Nanite是一个很棒的工具,包括虚拟阴影纹理和纹理流送池之类的东西。但是Lumen可能不适合出现在游戏主机平台上,特别是以60帧为目标的游戏,Lumen的消耗太大了。但如果在Lumen设置中在画面与帧率之间做取舍也许是一个不错的选择。    
我们需要考虑场景中的光照,这些光照会不会投射阴影,是否动态等等。因为投射阴影和动态的光照一般消耗很大。或者使用自发光伪造光源,以达到高性能的目的。现在的虚幻引擎工作流可以让我们实现完全动态的阴影与光照了,但是我们还需要回到要烘焙光照的时代吗?对于VR游戏这种需要高帧率的实时产品,我们还是需要在复杂光照场景中烘焙光照,以达到最好的性能表现。
我们还需要考虑游戏设计。比如我们只需要只做一个白天的、使用单一定向光源的关卡,就算用上Lumen也能达到高帧率的目标。虽然说达到了技术与视觉效果的目的,但是如果我们制作的是一款蝙蝠侠主题的游戏,我们就不应该把游戏设定在白天。


Q2:我们该怎么知道做出来的东西能不能跑? 

尽早测试,经常测试。我们要做的就是在最终目标硬件和最低配置硬件上进行测试,然后把测试结果转换成团队中能够理解的信息,根据测试结果不断调整优化。测试时最好使用在预生产过程中最有可能影响性能的资产,然后在开发过程中始终追踪这些测试场景中的性能表现。
还有更重要的一点是,确保在最终的光照环境中进行测试,而不是在太简单的光照下进行游戏测试,因为角色会在这些区域移动,太多的光源会导致性能问题。所以确保场景中的灯光数量合适,并且考虑角色应该如何被场景灯光照射,也就是角色的材质是否复杂、角色是否会在大量光源重叠的地方被渲染等。很多电影制作人在制作过场动画时频繁在角色上打光,以达到电影级别的视觉效果,性能问题也随之出现了。而在虚幻引擎中,我们能否用一种更低成本的方案去达到这样的角色效果呢?这对于您我、Steve而言都还是个问题。    
并且我们要有开关去开启或者关闭一些功能,帮助我们进行性能测试,定位性能问题。比如角色有没有头发、材质有没有WPO偏移、有没有使用Mask纹理、光源是否投射阴影等等。
接着就是使用开关进行实际的性能测试演示,默认状态下:
关闭遮罩:
关闭世界位置偏移:    
关闭遮罩与世界位置偏移:
可以很明显看出,WPO偏移和Alpha遮罩这两种渲染功能都会大大影响我们的游戏性能。根据下图,静态的不带遮罩的网格体消耗最少,而加上透明度遮罩和世界位置偏移之后,消耗最大。因为动态的树叶会导致阴影缓存随时都会在变动,而遮罩会加大阴影计算的消耗。所以在这个案例中,Steve与他的团队选择关闭阴影的Alpha Test,这样会导致树叶如果有Alpha Mask的话,阴影就只能投射几何形状,而不考虑Alpha Mask。这样的话树叶就需要完整的建模,而不是采用Mask的形式制作,虽然面数增加了,但是与Alpha相比还是更优的。因此从长远来看,这个方案在预生产中就提出是相当好的,如果在开发后期才发现,就需要重新制作所有的树叶模型,耗时又费力。    


Q3:我们怎么充分利用现有的技术? 

Q3.1. 虚幻好在哪儿 

  • 我们可以使用比之前时代、比其他引擎用户更高细节的模型,因为虚幻有Nanite

  • 虚幻的静态灯光有一个特点,假如物体和灯光都静态,VSM会缓存阴影,大大减少性能消耗。

  • 我们还可以使用Lumen只用一个灯光点亮一整个空间

  • 我们还可以用MetaHuman轻松制作出一个很真实的角色,对于小型工作室而言是一个重要的功能。

  • 虚幻支持很多领域的工作流,不同学科的人都能在虚幻找到用武之地    

                 

 

Q3.2. 虚幻引擎里这些功能可能会消耗性能 

  • 移动的阴影。移动的阴影有可能来自于移动的光源或者是移动的物体。在引擎自带的几种光源中,聚光灯消耗的性能较少。尽可能避免太多灯光影响同一个移动的物体。
  • 移动的植被。如果有很多东西在移动,会导致Nanite和阴影都会造成很大的性能成本。如果场景内有很多移动的物体,尽量避免使用有阴影投射的灯光。如果想了解更多关于阴影控制的知识,可以找找Matt Oztalay的演讲。
  • 头发。对于当前世代的主机来说,面片头发似乎还是一个更好的选择。发丝通常会带来很大的性能影响。
  • Alpha遮罩。最好提高模型精细程度,而不是使用Alpha遮罩。    

五、最后回顾 

我们认识到整体测试结果比单个数字指标更好;并且还通过灵魂三问,问了自己一些问题,了解到了项目中我们需要知道哪些信息;还意识到了从项目开始就要进行测试,贯穿整个开发流程,根据数据进行开发调整;而且在复杂的测试环境中要找一个简单的影响因素,方便我们定位问题;最重要的是要根据需求将性能预算用在合适的地方。

总结

以上便是关于大型场景做预算的主题分享,有预算确认指导,也有优化技巧分享,希望这些知识能够帮助您的团队在构建中大型游戏项目时直面并解决性能问题。祝创作愉快,工作顺利!    
近期焦点
Epic全新一站式内容商城Fab今日上线!
Epic for Indies现已登陆Epic开发者社区
虚幻引擎里你可能不知道的功能 | UnrealFest演讲精粹
使用简单的通用材质来提高UI性能 | UnrealFest演讲精粹
为手机优化生存游戏 | UnrealFest演讲精粹

扫描下方二维码,关注后点击菜单栏按钮“更多内容”并选择“联系我们”获得更多虚幻引擎的授权合作方式和技术支持
长按屏幕选择“识别二维码”关注虚幻引擎
“虚幻引擎”微信公众账号是Epic Games旗下Unreal Engine的中文官方微信频道,在这里我们与大家一起分享关于虚幻引擎的开发经验与最新活动。

虚幻引擎
Epic Games 旗下 Unreal Engine 虚幻引擎官方订阅号
 最新文章