ue4渲染速度太慢_技术汇丨如何在UE4中实现最佳性能和高质量视觉效果

合并网格

如之前在线框可视化解释中提到的,减少三角形和顶点的数量永远都是提高性能的方法,但是很多时候,一个单独网格比多个网格刻画集合图形的性能要好得多(一个有1000个顶点的网格可能比10个有100个顶点的网格的更新和渲染都快)。这是因为不仅这些网格可能会分别单独调用GPU来绘制,也因为UE4会为每个网格单独保存和更新变换信息,而且可能检查这些独立网格间的碰撞。所以,如果没有功能性的原因来设置单独网格的话,你应该考虑在把它们引入UE4之前在DCC工具中选择合并它们。

关于合并网格反对的说法是:一个单独的网格可能不能被部分剔除,所以如果它的任何一部分是可见的,整个网格都会渲染。由于这个原因,可能把你的整个关卡都合并成一个单独网格可能不是一个好主意,但是让每一个三角形都成为一个单独网格同样也不是最理想的,所以在两种极端中取得平衡至关重要。

由大量网格组成的单一对象

使用由很多独立网格组成的对象(比如说一辆车的每个独立部分由成百成千的单独网格组成)对于引擎来说可能任务非常繁重,如果引擎在仿真时把每个网格当做独立对象,而且为每个网格单独运行引擎系统(例如:在你的对象中为几千个网格进行单独的挽歌物理仿真)。

像这样对许多网格组件进行父处理并且把它们作为一个对象处理比较好,但是我们有一些建议提供给你,来避免在这些事情上浪费不必要的CPU和GPU的周期。

首先,如果你的对象中有许多网格并且经常不可见,试着不要在移动场景中建立这些网格直到它们可见。即使网格没被渲染,每当一个父级网格组件的变换改变时,每个子网格组件的变换都会被更新,而且在网格需要可见前不要调用Components.Add()方法,这样可以节省许多处理器周期。

同样道理也适用于在游戏系统中注册不可见的网格,如果网格不可见,它的物理形态等可能不需要每帧都更新,所以,在网格需要变为可见之前不要在不可见网格组件上调用RegisterComponent()方法。

避免在由相同对象组成的、或不需要相互碰撞的网格间运行碰撞检测。

对于那些不需要碰撞的子网格组件,把它们的碰撞情况设置为无:

ChildMeshComponent­>SetCollisionProfileName(UCollisionProfile::NoCollision_ProfileName);

如果你的角色一点也不需要碰撞,那么就在你的父级网格组件上设置相同的内容,否则就在父级上启用碰撞,但是给它一些能表示它和它的孩子的碰撞说明。

如果包含你的角色的网格组件是接触的或重叠的,它们就会产生重叠时间。如果你不在意这些事件,禁用它们会提升性能:MeshComponent­>bGenerateOverlapEvents = false;

屏幕剔除系统用网格组件的边界来确定该网格是否应该在这一帧中渲染。对于那些含有许多网格组件的对象来说,即使对象部分在屏幕外,为每个独立子对象检查边界的代价也可能比单纯渲染所有网格组件的代价要大。试着设置子网格组件使用它们父级组件的边界,来测试观察性能是否没有提升。

ChildMeshComponent­>bUseAttachParentBound = true;

给所有这些网格单独打光是不必要的繁重任务——在CPU配置文件中渲染线程部分中“更新间接照明缓存”的毫秒数值很高。通过在你对象的根组件中设置bLightAttachmentsAsGroup为true,你可以选择在你的对象的每个网格中使用相同的间接照明缓存信息,这会节省独立更新网格的时间。

推荐的光线性能设置

动态对象的每个对象阴影可以通过不选关卡平行光中的bUseInsetShadowsForMovableObjects 的flag来禁用,这会提升性能。

在你的关卡的平行光属性中,经常减少动态阴影级联的数量不会对阴影外观产生非常大的影响,但是会提升性能,我认为默认的是5,但是减少至大约3的样子就会产生大致差不多的效果。

动态阴影

动态阴影的代价可能很大,尤其是全局动态阴影。这是因为三角形必须得为动态阴影映射重新渲染。如果你在移动光源上需要许多动态阴影来使多边形尽可能少,如果你想要更多多边形,那就试着少用带有动态阴影的可移动光线。

记住,设置了4个以上的重叠固定光线会迫使半径最小的那个变成可移动的,这样就会开始投射动态阴影。本文他处讨论的固定光重叠可视化是确保没有过多重叠的好方法。

限制后过程效果

后过程效果同样是代价很大的,禁用你不需要的效果也可以很大地提升性能。一些可以考虑禁用的后过程效果包括镜头闪光、土地深度和屏幕空间反射。为了提升性能,你可能也想要以低质量运行屏幕空间抗混叠,以更小的散景尺寸运行散景DOF,因为这里的尺寸与性能是负相关的(更大的散景意味着更差的性能)。

如果最终你可以在其它系统中取得足够的性能提升,你可以之后选择性地把这些效果重新启用。

高存储低质量影响

在后过程设置中禁用scene color fringe

禁用 ambient cubemap,用 LightmassEnvironmentColor代替

通过设置强度在后过程设置中禁用imagebased lens flares 。

在单一镜头中限制贴花数量

如果在摄像头中同时有许多彼此接近的贴花,有时这样的代价是很大的。如果你有比如说50个贴花正同时被渲染,这对于性能可能有消极影响。试着稀释或扩散这些贴花,那么就不会有那么多贴花同时被渲染了。

以更低分辨率和更少变形渲染

如果你想要试着以稍低的分辨率和稍少的变形进行渲染来节省性能,试着做、看看它看起来和运行起来效果如何是非常简单的。

当游戏运行时,你可以打开控制台输入“r.screenpercentage 90”,其中90是全凭尺寸和渲染的百分比。

更永久的设置方法是:选中你的后步骤列表里的“覆写屏幕百分比”框,之后将屏幕百分比设置成想要的百分比(小于等于100)。

场景捕捉对象

场景捕捉对象(如场景捕捉立方体)的默认设置是捕捉每帧。捕捉这些基本涉及到从不同视角渲染整个场景(对于一个场景捕捉立方体来说,会这做6次,每次渲染立方体的一个面),还有从玩家的视角来渲染。这样的代价明显是很大的(如果一个场景中有许多这样的对象尤其如此),所以,除非每帧都抓取它们是你的游戏的一个重要特点,抓取应该被禁用。

总体来讲,同样的原因,限制场景抓取物件的总数量是有道理的。

其它涉及事项:

设置最大和最小帧率

可以在DefaultConfig.ini.文件中设置来控制这个变量,默认如下:

[/Script/Engine.Engine]bSmoothFrameRate=true MinSmoothedFrameRate=22

MaxSmoothedFrameRate=62

禁用遮挡剔除

对于一些特定类型的游戏,遮挡剔除可能会花费比它本身所节省的时间更多。比如:在打斗游戏中,通常场景中的所有内容都应该是被渲染的,不常见的情况是许多几何图形被其他对象遮挡,在这些情况下,使用全局预计算可见复选框也许有帮助。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值