优化的核心概念

辨别 GPU、渲染线程和游戏线程问题

适当地提供了一些虚幻引擎 3 功能,它们可以使特效师故障排除性能问题。首先,从确定您的效果出现瓶颈现象的地方到优化正确的问题还有一段很长的路要走,因此保留视觉效果完整性/质量。

其中一种检测在玩关卡时出现的问题的方法是在界面上调出 STAT UNIT 调试信息。

  1. [[#LaunchGame]在您的控制台上启动游戏]]

  2. 点击选项卡并输入 'stat unit'
    statunit.jpg

这个 stat unit 命令会显示当前帧在 Game Thread(游戏线程)上所花费的时间,Render thread(渲染线程)所花费的时间以及 GPU 所花费的时间。可以监控由 stat unit 更新的不同时间,了解出现性能问题的关卡区域。

关注不同的线程时间,如果您的目标帧速率是 30fps,那么所有县城应该保持在 33.3 毫秒以下。

如果所有线程都经历了 33 毫秒,而且您的粒子被怀疑是引起问题的原因,那么您可以使用 **STAT PARTICLES** 命令估算粒子在不同线程上花费的时间。

statparticles.jpg

**STAT PARTICLES** 会列出与游戏线程和渲染线程相关的多个统计数据。 注意描画调用函数(渲染线程)和更新时间(游戏线程)。

定位与 Game Thread(游戏线程)相关的问题

只要您确定出现了 Game Thread(游戏线程)问题后,那么请使用 STAT PARTICLES 命令验证您的发现。

这个统计数据会提供很多信息,所以请在链接的页面上阅读相关描述,以便帮助您确定您在哪里消耗的性能最多。注意 Particle Tick Time(粒子更新时间)以及您的 Particle Count(粒子数量)。

注意: 重要的是记住粒子系统是构成效果的组件(发射器/模块)的集合。在您的系统中唯一的发射器和模块越多,那么在您的场景中的这些系统越多,Game Thread(游戏线程)消耗的性能越多。

如果您的更新时间比较高,那么使用 **ParticleTickStats** 命令识别哪些系统是主要影响因素。

**ParticleTickStats** 命令有 3 个参数:

  • Single - 该参数将会捕获一个单独的帧,然后写到一个文件

  • Start - 该参数将开始捕获统计数据

  • Stop - 该参数将结束统计数据,所以您可以看到一段持续时间的更新时间

然后将 ParticleTickStat 报告写到下面目录:

[UE4 Directory]\[YourGame]\Profiling\PSTick-[sys time].csv

将这个电子表格划分为行和列,以此体现您的效果消耗

particletickstats.jpg

Total Tick ms

更新所有 Particle System(粒子系统)实例所花费的时间总量

Avg Tick ms

更新粒子系统的平均时间(更新总时间/更新数)

Max Tick ms

粒子系统实例的最高更新时间。

Ticks

粒子系统实例的数量

Avg Active/Tick

在该粒子系统更新过程中处于激活状态的粒子平均数(粒子总数/更新数)

Max Active/Tick

在该粒子系统更新过程中(在一个单独的实例中)处于激活状态的粒子最大数量

根据您所处的平台,您将会需要通过适当的方法浏览到这个目录。该文件通过逗号进行分割,而且可以在 Excel 中打开。

只要您识别了会产生影响的 Game Thread(游戏线程)系统后,可以采取以下几种方法。

  1. 减少所使用的系统上的粒子发射数量。

  2. 减少场景中的粒子系统数量。

  3. 减少您的某些发射器的生命时间(计算粒子评估的时间量)。

  4. 检查诸如碰撞这样性能消耗高的计算,确保您所使用的设置是最佳设置,减少碰撞或发生碰撞的粒子/网格物体的数量。

  5. 如果需要,删除诸如碰撞、动态参数等等性能消耗高的计算。

  6. 如果可以,使用静态网格物体效果替换计算 Game Thread(游戏线程)的粒子效果。

  7. 在您的粒子系统上设置 Fixed Bounds(固定的边界),这样您就不需要在每一帧计算它们。

  8. 增加 LodDistanceCheckTime,这样您就不需要经常检查 LOD(针对的是将 LODMethod 设置为自动的循环效果。)

在控制台上使用 Unreal Front End 启动编译版本

可以在您的项目 binaries 文件夹中找到 Unreal FrontEnd

[UE4 Directory]\Binaries\UnrealFrontend.exe

Unreal Front End 是一个 GUI,它允许任何规程可以快速烘焙和部署一个编译版本或关卡,在目标平台上查看本地数据。还可以将 Unreal Front End 作为您的项目的启动点使用,其中含有连接到编辑器和许多其他工具的链接。

对于效果性能,我们将会在启动游戏的时候集中使用两个参数,相对准确地了解游戏运行状况。 在 Launch Option(启动选项)框中有 -novsync、-noverifygc 和 -noailogging 命令。

-novsync 禁用了垂直同步(锁定 fps @ 30),所以我们可以看到场景中消耗性能情况,-noverifygc 禁用了频繁产生可见停顿的周期垃圾回收,而 -noailogging 禁用了会大幅降低游戏速度的 ai logging,aiLogging 和垃圾回收在背景中运行,启用它们会降低性能。 禁用这些功能将会在最终发行版本中可以再现更接近真实的帧速率,减少磁盘加载时间。

frontend.jpg

在一个调试版本中进行这个测试的任何部分时,重点是要记住在最终发行版本中看不到的调试模式中运行游戏时是有消耗的。使用诸如 stat overlay(统计数据叠加)这样的工具时都是有消耗的,而且会使您的结果出现轻微的偏差。

FX 的故障排除批处理文件

这里有一些命令行开关,它们专门用于检查效果的批处理文件是否发生常见问题,然后输出列有影响因素的电子表格。

这些命令行开关包括:

ParticleSystemAudit

该命令行开关将会在由 MineCookedPackage 得来的数据库中包含的所有粒子系统上进行审核。

注意: 它将会被更改为使用 'On DVD' 标记,与此同时简单地检查所有现有的粒子系统。

它将会生成包含以下内容的 csv 文件,以此帮助优化/修复内容:

所有粒子系统 w/ 没有 LOD 关卡 :没有 LOD 关卡表示粒子系统是'空的'。
所有粒子系统 w/ 单独 LOD 关卡 :应该复查这些系统确保它们不是环境(放置关卡的地方)效果。在这些情况下,您通常需要这个距离范围内采用 LOD 关闭发射器。
所有粒子系统 w/超出设置的固定边界 :可以超出的所有粒子系统应该促使这些相对固定的边界改变。
所有粒子系统 w/ 自动化 LOD 方法 & 检查时间 0.0 :它表示的情况是该粒子系统将会在每一帧都检查它的 LOD。
所有粒子系统 w/ 启用了 bOrientZAxisTowardCamera enabled :如果您的游戏支持分屏,那么这些系统将会产生问题。
所有粒子系统 w/ 漏掉的材质 :这些系统将会使用默认的材质进行渲染。
所有粒子系统 w/ 没有发射器 :这些系统是'空'的 - 是否应该将它们删除?
所有粒子系统 w/ 至少要在一个发射器中发生碰撞 :当前的碰撞方法对于粒子而言是一个性能消耗非常高的操作。

FindOnDvDPsysDynamicParameter

这个命令行开关会找到任何使用动态参数模块的效果,请参考其中没有正在运行的动态参数材质表达式的材质。这个过程并不是非常安全,最佳实践方案是在删除动态参数模块之前通过材质编辑器验证结果。