获取结果

用粒子系统分析常见的故障区域。

Choose your operating system:

Windows

macOS

Linux

Cascade中的核心系统 - GPU/游戏线程/渲染线程

Cascade创造了稳健的粒子系统,其动态成本分布于UE4中的三个核心引擎系统上。游戏线程、渲染线程和GPU。

  • 粒子模拟时间(标记)在游戏线程上计算。

  • 粒子数据定型(打包几何体、绘制调用)在渲染线程上计算。

  • 粒子视觉(着色器复杂度、过度绘制)在GPU上计算。

所有这些系统都是并行计算的,所以任何一个系统的速度变慢都意味着渲染过程中出现瓶颈,这就相当于低帧率。在Cascade中创建粒子系统时,考虑全部三个过程是很重要的。

同样重要的是要注意Cascade在游戏线程上运行粒子评估,这与执行游戏进程计算所在的位置是相同的。

过度绘制 - GPU

当您将一个材质添加到sprite的表面时,该材质在指令数上有一定的成本开销。对于半透明对象,该指令的成本开销随着半透明性的堆叠而增加,从而产生过度绘制。半透明层越多,成本开销越高。在其最简单的形式中,过度绘制可以描述为:

过度绘制 = 像素着色器成本 = 层数 * 一层影响的平均像素数 * 一层的平均指令数

着色器复杂度模式(Shader Complexity Mode) 中很容易就能看到这个成本。鲜红色 = 300个指令,粉红色 = 600个指令,白色 >= 900个指令。按 Alt+8 在PC上查看着色器复杂度。

材质的指令数可在材质编辑器中查看。

着色器复杂度输出系统成本的近似值;然而,它也依赖于场景,因为半透明度是针对不透明对象计算的,而不透明对象也有成本开销。

检查效果的使用情况是至关重要的。在任何给定的场景(武器影响)中都可以调用的效果通常需要比为匹配特定场景而定制的效果更轻,因为它将在成本波动的场景中绘制。

可以采取一些步骤来控制过度绘制的影响:

  • 降低发射率。

  • 减少材质指令数。

  • 减少粒子比例(减少屏幕的填充)。

  • 为近/远的粒子发射创建LOD,以降低不同视图距离下的成本。

  • 检查排成一行,互相堆叠的发射器(静态放置效果)。

LOD - 细节层级 - GPU/游戏线程

Cascade中的LOD为用户提供了基于从玩家到发射器的距离来控制模块和行为的能力。可以修改粒子系统中的任何属性以使用LOD系统。

有关设置LOD的更多技术信息,请参阅 Cascade参考指南 粒子系统细节层级(LOD) 部分。

创建LOD时务必要记住,非共享模块会带来内存开销。跨LOD共享尽可能多的模块可以减少内存占用。仅为要修改的属性创建唯一的模块设置。

detailModes.png

Cascade中的预览模式和编辑器透视视图的行为方式不同。为了在Cascade中得到正确的视图,请确保将 视图(View) -> 细节模式(Detail Mode) 设置为 高(High)

Cascade允许在LOD之间切换并显示指定的LOD。请确保禁用编辑器LOD视图模式,以便正确地查看Cascade更新。

启用编辑器预览允许在场景中飞行,并在移动时查看LOD之间的粒子系统切换。

重要的是要测量场景,真实地了解需要多少单位才能看到正确状态下的效果。在环境粒子系统的情况下,当粒子系统可能不可见时,可以发射0.00个粒子并减少标记时间。测量距离可以通过按住鼠标中键并拖动任何正交视图(前视图、侧视图、顶视图)来完成。

LOD距离检查时间

LOD距离检查时间(LOD Distance Check Time) 功能规定了游戏多久检查一次玩家与场景中发射器的距离,以确定使用哪个LOD。当LOD方法(LOD Method)设置为自动(Automatic)时,LOD距离检查时间(LOD Distance Check Time)起作用。

如果设置为自动(Automatic),基本上会随着运行过程让游戏决定LOD。如果增加LOD距离检查时间,检查间隔时间将会增加。LOD距离检查时间是以秒为单位计算的,所以在设置这个时要考虑玩家的最大移动速度。如果将LOD距离检查时间(LOD Distance Check Time)设置为0.00,则每一帧都会检查距离,这可能会导致性能下降。

LOD方法 - 游戏线程

适当地设置LOD方法对于性能和视觉效果非常重要。

自动(Automatic) - 游戏将根据效果中定义的距离参数设置LOD,使用LOD距离检查时间(LOD Distance Check Time)设置。通常用于循环且不被游戏代码调用的环境效果。

直接设置(Direct Set) - LOD是在产生效果并停留在定义的LOD时确定的(通常由游戏代码决定)。通常用于爆炸或撞击等突发效果。

自动激活(Activate Automatic) - 根据LOD中定义的距离参数,在产生效果时定义LOD。通常用于由蓝图等调用的突发效果,这些效果要求LOD在生成后永不移位。

固定与非固定边界 - 游戏线程

边界是引擎用于决定效果可视性的方法之一。这些不可见的坐标告诉引擎某个效果是在视图中还是在视图外。如果边界的一个角是可见的,引擎将计算所需效果的任何组件。

边界成本高昂,它们检查和更新每一帧,因此最好将边界设置为固定的,并确定需要多大的边界。在某些情况下,如果需要查看从爆炸中飞出的每一块碎片,您可能需要将您的边界设置得较大。如果您希望将成本保持在较低的水平,那么收紧核心组件的边界可以提高性能,但当边界超出视野时,效果可能会突然消失。

有一些关于固定边界和非固定边界的注意事项需要牢记。

快速移动的效果,如火箭轨迹、跟踪器或附在发射物上的任何东西,不应该设置固定的边界,也不应该设置太大的固定边界,使发射器不能飞出边界。

设置边界时,请注意系统中定义的局部空间坐标和世界空间坐标。如果发射器旋转的方向与您的边界方向相反,那么效果的元素就有可能飞出您的边界,元素也有可能跳出您的视野。

绘制调用 - 渲染线程

粒子系统中的绘制调用有时很难跟踪。在确定绘制调用成本时,需要考虑几个综合因素。

无论屏幕方向如何,Sprite粒子发射为每个发射器一个绘制调用。

网格体发射为每个网格体发射器一个绘制调用,不管发射了多少网格体。然而,在移动设备上,每 发射 一个网格体就需要一个绘制调用。所以,在移动设备上,如果效果中有2个发射器,每个发射器发射10个网格体,总成本就是20个与粒子系统相关的绘制调用。

材质通道也决定了绘制调用成本。材质中的通道越多,效果中的绘制调用就越多。

例如:

  • 粒子系统A包含以下项目:1个发射器,生成12个sprite,使用带1个通道的材质,整个系统需要1次绘制。

  • 粒子系统B包含以下项目:1个发射器,生成12个sprite,使用带2个通道的材质,整个系统需要2次绘制。

  • 粒子系统C包含以下项目:1个发射器,生成12个网格体,使用带2个通道的材质

    • 在移动平台上 :整个系统需要24次绘制。(每次调用2个通道 X 12个网格体(因为每个网格体都是一次绘制调用)= 24次绘制。)

    • 在所有其他平台上 :整个系统需要2次绘制。

  • 粒子系统D包含以下项目:1个生成6个网格体的发射器,使用带2个通道的材质,1个生成10个sprite的发射器,使用1个通道,整个系统需要13次绘制。(每次调用2个通道 X 6个网格体(因为每个网格体都是一次绘制调用)= 12次绘制,1个通道 X 10个sprite = 1次绘制调用。)

提供通道的材质属性包括:

半透明材质 = 1个基本通道

  • +2个通道,用于失真

  • +1个通道,用于"bUseLitTranslucencyDepthPass"

  • +1个通道,用于"bUseLitTranslucencyPostRenderDepthPass"

  • +2个通道,用于"bUsedWithFogVolumes"

不透明/遮罩材质 = 2个基本通道

使用"DumpParticleFrameRenderingStats"命令可以查看特定场景的绘制调用。此命令输出一个电子表格,其中详细列出绘制调用成本。

绘制调用的影响与渲染的视图数量成比例地增加。这意味着在分屏中,效果是成倍的。有关优化分屏效果的更多详情,请参阅 VFX优化:分屏 页面。

在构建效果和优化效果时,务必牢记这些成本。如果您的渲染线程因绘制调用的缘故而较高,而且环境在预算之内,那么这就是您要探究的地方。

网格体发射 - 游戏线程/渲染线程

网格体发射是Cascade更为强大的功能之一。这一功能在移动设备上可能会被意外滥用,因为发射率等同于绘制调用的数量。此外,保持网格体上较低的顶点数也是一个好主意。

在某些情况下,单个网格体发射可以用来伪造大量对象,而不需要计算所有sprite的位置,这些sprite可用于创建大量的碎片。

CPU碰撞 - 游戏线程

通常情况下,在虚幻引擎4中进行CPU粒子碰撞的代价很高,所以应该只在需要时使用它们。

可以使用几个设置来最大程度降低碰撞成本,其中包括:

  • 最大碰撞数(MaxCollisions) :保持这个值尽可能低。

  • 碰撞完成(Collision Completion) 选项:将它设置为中止碰撞(HaltCollisions)/冻结(Freeze),以在达到最大碰撞数(MaxCollisions)之后停止对场景执行碰撞检查。

  • 阻尼因数(Damping Factor) 决定碰撞后物体的弹跳,较低的值可能导致物体更快地静止(较低的最大碰撞数(Max Collisions)值)。

每单位生成 - GPU/游戏线程

每单位生成(Spawn Per Unit) 是Cascade的一个功能,当粒子系统运动时,它有助于填补间隙。虽然这个功能可以很方便地用于创建漂亮的粒子轨迹,但是在使用每单位生成(Spawn Per Unit)时,平衡视觉效果和性能限制是很重要的。

有一些控制发射的技巧:

  • 保持尽可能高的单位标量值,并将其与发射率保持平衡,以获得所需的填充,而不会使效果太重。

  • 如果您知道使用每单位生成(Spawn Per Unit)会有较高的发射率,尝试使用较低指令数的材质。

  • 调整最大帧距,以限制可以发射的粒子数。如果发射器超过这个距离,最大帧距每单位生成(Max Frame Distance Spawn Per Unit)将停止发射,直到它返回该距离以内。这可以防止发射器向场景中加入大量的sprite。

内存成本

Cascade能够显示大量与粒子系统创建相关的有价值信息。打开这些显示屏通常有助于了解系统分配的粒子数,以及系统发射的粒子数。

粒子分配决定了发射器在任何给定时间可以在世界场景上放置多少粒子,这在很大程度上决定了粒子系统将消耗的内存数量。您可以通过在Cascade中的视图(View)下拉菜单中启用粒子内存覆层来查看内存估算。

通过调整设置,可以看到内存成本的增加和减少。

减少内存占用的几种方法包括:

  • 将系统中的模块数量减少到给定行为所需的基本模块数量。

  • 为了循环使用效果,减少循环时间/持续时间(每个循环分配更少的粒子)。

  • 减少使用寿命(总体上减少粒子)。

  • 共享尽可能多的模块。

Cascade具有将一个发射器的模块共享给下一个发射器的功能。使用这个功能有两个好处。首先,如果希望跨多个发射器编辑值,可以编辑一个模块并更新所有其他设置。其次,共享模块可以减少内存占用,因为烘焙版本将模块成本看作模块的一个实例。

最近添加到烘焙器的新功能评估粒子系统中的所有模块,确定相同的模块,然后共享模块,以自动减少烘焙时的内存占用。

标记时间 - 游戏线程

标记时间(Tick Time) 表示场景中更新粒子系统所花费的时间。标记时间可以通过stat particle命令查看,该命令列出了评估粒子估算成本所需的所有相关信息。

有许多方法可以用来降低标记成本。

标记时间直接受到您场景中活跃的发射器Actor数量的影响。场景中活跃的发射器越多,标记时间就越长。如果需要在关卡开始时循环发射器,发射器仅应设置为自动激活(autoActivate)。

如果在编辑器的关卡加载上可见大量的sprite/爆炸/突发效果,那么这些效果将在运行时自动评估,并且在加载关卡时可能导致可见的迟缓。

粒子参数可以在效果中使用,以便在效果被放置到世界场景上后允许位置偏移。通过使用粒子参数,可以减少发射器数量,从而降低标记的总体成本。粒子参数可以通过从模块中的分布列表中选择particleParameter进行设置。

当发射器Actor不在视野中,或者如果它们与某个关卡中不再存在于内存中的区域相关联,则可以将它们流送出来并禁用它们。使用几何体流送发射器Actor是减少标记开销的一个良好实践。在某些情况下,大气效应很重,蓝图操作可以用来在战斗序列期间打开和关闭大气,以减少标记时间和过度绘制。

粒子系统加载到内存中,但在视野之外(比如在您上方的楼层),这也可以通过蓝图操作和流送体积来切换,以降低评估成本。

在某些情况下,网格体效果可以很好地替代粒子系统。放置的静态网格体在游戏线程上没有评估成本。很多情况下,放置一个静态网格体作为粒子系统的替代品更有益。这包括vista效果,雾效果等。

粒子数直接影响评估成本。场景中的粒子越多,它们存活的时间越长,需要的评估就越多。将使用寿命限制在效果所需的时长内,这是一个很好的实践。

在粒子系统中启用LOD允许在系统未处于最佳查看范围内时减少粒子发射。它可能有助于从英雄状态角度考虑您的效果,并提供可接受的较低质量水平以允许更长的查看距离。在不显著降低视觉质量的前提下,将LOD压缩到所需的距离可以大大降低场景的评估成本。

检查具有高评估成本,但可设法将成本降低的效果,例如碰撞、非固定边界,和过高的每单位生成数。将边界设置为固定状态可以显著提高性能,应该尽可能地使用。

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消