UE4 性能优化方法

2016年12月07日 16:09 0 点赞 0 评论 更新于 2025-11-21 20:59

在游戏开发过程中,游戏帧率过低或出现卡顿现象可能由多种原因导致。此时,盲目猜测问题所在,如怀疑是人物过多或渲染内容过多,往往意义不大,还可能浪费大量时间却找不到关键所在。当然,运气好的话也能找到性能瓶颈,但更有效的方法是借助相应工具来查找。本文将以 UE4 为例,详细讲解性能优化的相关方法。

确定性能瓶颈所在

首先要明确瓶颈是在 CPU 还是 GPU。为了找出问题所在,需以非 debug 版本启动程序,并在控制台上输入 stat unit 命令。若在 Android 平台上,可同时按下四个手指打开控制台,再输入 stat unit,此时会显示相关信息。

各时间含义及瓶颈判断

  • Frame 时间:产生一帧所花费的总时间。由于逻辑线程(Game)和渲染线程(Draw)在一帧结束时需要同步,所以一帧花费的时间通常与其中一个线程的时间相近。
  • GPU 时间:测量显卡渲染当前场景所花费的时间。由于 GPU 时间与当前帧同步,所以它与一帧花费的时间也基本相近。

根据各时间的比较来判断瓶颈位置:

  • 若一帧花费的时间与逻辑线程的时间比较接近,那么瓶颈在逻辑线程。
  • 若一帧花费的时间与渲染线程的时间比较接近,那么瓶颈在渲染线程。
  • 若上述两个时间都不接近,但与 GPU 时间比较接近,那么瓶颈在显卡上。

第三方工具辅助判断

除了上述方法,还可以使用一些第三方工具,如 Intel VTune、Aqtime 等。在移动平台上,可以使用 Apple Instruments、NVIDIA Tegra System Profiler、ARM DS - 5 等。

逻辑线程瓶颈分析

性能分析步骤

通过 ~ 打开控制台,输入 stat startfile,让程序运行至少 10 秒以获取多帧的平均值。注意,若运行时长过长,生成的文件会很大。之后输入 stat stopfile 结束性能分析。此时会在工程路径下生成一个后缀为 ue4stats 的文件,若为 Android 平台,则会在安装目录下生成一个 profile 目录。若要查看分析结果,需将该文件拷贝到 PC 上,可使用 adb pull {ue4stats 完整路径} {pc 保存路径} 命令进行拷贝。

结果查看方式

可以使用 UnrealFrontEnd(与 UE4Editor 在同级目录)打开分析结果,也可以在 UE4Editor 中通过 window --> Developper Tools --> Session Frontend,打开后切换到 Profiler 面板,通过 load 来打开 ue4stats 文件。

卡顿查看方法

打开分析结果后,若要查看卡顿情况,可在时间线上查看高峰的地方。通过选择 Maximum 而非 Average,这样会显示一些峰值。

GPU 分析

内置命令与快捷键

在 PC 平台上,可以使用 ProfileGPU 命令,或者使用快捷键 Ctrl + Shift + ,

第三方工具

也可以使用一些第三方工具进行测试,在 PC 平台上如 Intel GPA、Nvidia NSight Visual Studio Edition;在移动平台上,如高通的 Adreno Profiler、NVIDIA Tegra Graphics Debugger、ImgTec PVRTune 和 PVRTrace、ARM Mali Graphics Debugger 等,苹果的 XCode 也可用于分析。

常用命令

以下是一些常用的 UE4 性能分析命令:

  • stat unit
  • stat scenerendering
  • stat engine
  • stat initviews
  • stat game
  • Stat Slow
  • ViewMode ShaderComplexity
  • Stat UnitGraph

完整的 stat 命令参考:https://docs.unrealengine.com/latest/CHN/Engine/Performance/StatCommands/index.html

有用的变量及功能

  • r.SetRes:改变屏幕或窗口的分辨率。
  • r.VSync:开启/关闭垂直同步(可能依赖于是否原生全屏)。
  • r.ScreenPercentage:用于减小内部实际渲染分辨率,画面会重新放大。
  • r.AllowOcclusionQueries:用于禁用遮挡(可能会让场景运行更慢)。
  • r.TiledDeferredShading:能够关闭基于 Tile 的延迟光照技术(GPU 粒子的光影则没有退回方法)。
  • r.TiledDeferredShading.MinimumCount:能够调整使用多少灯光应用在基于 Tile 的延迟光照技术(视觉上无差异但性能会不同)。
  • Pause:暂停游戏或者 Matinee(分析时更稳定,但禁用了 Update/Tick)。
  • Slomo:能够对游戏进行加速或者减速播放。
  • r.VisualizeOccludedPrimitives:显示被裁剪掉的物件的外盒框。
  • StartFPSChart StopFPSChart:具体功能请看下文。
  • r.SeparateTranslucency:用于修复半透明情况下景深的问题,不需要时可关闭,可能有其他影响(查阅 SceneColor)。
  • r.Tonemapper.GrainQuantization:用于关闭在 Tonemapper 中添加的噪点以避免 Color Banding,由于 8bit 量化和较小的质量改进在输出为 10:10:10 时并非必需。
  • r.SceneColorFormat:能够选用不同的 SceneColor 格式(默认是 64bit 的最佳质量,并支持屏幕空间子表面散射)。
  • FX.AllowGPUSorting:禁用粒子排序(在大量粒子使用时可妥协使用)。
  • FX.FreezeParticleSimulation:禁止粒子的更新。
  • r.SSR.MaxRoughness:调整屏幕空间反射(SSR)粗糙度的最大值,并覆盖后处理中的该设置。请查阅 Show Flag VisualizeSSR。

命令行选项

有些功能可以在命令行中进行关闭,例如 UE4.exe –NoSound。以下是几个对分析比较有用的开关:

  • -NoSound:禁用声音和音乐系统。
  • -NoTextureStreaming:关闭贴图 streaming(对于隔离问题很有帮助)。
  • -NoVerifyGC:避免在 Release 版本中每 30 秒可能遇到的性能波动。
  • -NoVSync:能够更快地渲染,但会导致画面撕裂,尤其是在高帧数下。
  • -Streaming:在使用 StartFPSChart/StopFPSChart 时很有用,能够从非 Windows 设备上获取数据并用于进一步检测(假设是实时的 cook 数据)。

作者信息

孟子菇凉

孟子菇凉

共发布了 3994 篇文章