ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

UE5项目性能规划:开局定调与基础设置清单

UE5项目性能规划:开局定调与基础设置清单 1. 为什么UE5项目一上来就要做性能规划很多人装完UE5第一件事就是拖几个Lumen场景进去看效果帧率掉到30就开始骂引擎。我见过太多团队在项目中期才发现帧率崩了回头去查Draw Call、查Overdraw、查Nanite的Cluster开销结果发现根子出在项目创建时选错了默认模板和渲染管线。性能优化这件事在UE5里不是“后期调优”而是“开局定调”。这篇笔记是我自己在几个UE5项目里踩坑之后整理出来的基础设置清单主要面向刚接触UE5、准备做中大型场景或者移动端项目的朋友。核心解决三个问题项目创建时怎么选模板和渲染配置、引擎里哪些默认设置必须改、以及怎么建立一套可复用的性能检查流程。不涉及具体美术资产优化只聊项目层面的基础设置因为这些设置一旦定错后面改起来成本极高。UE5和UE4最大的区别在于默认启用了Lumen和Nanite这两个东西在PC上跑Demo很惊艳但放到实际项目里尤其是需要兼顾移动端或者中低配PC的场景就是性能杀手。所以第一步不是学怎么优化而是学怎么“关掉不该开的东西”。2. 项目创建阶段的性能相关决策2.1 模板选择与渲染管线确认打开UE5新建项目你会看到一堆模板第一人称、第三人称、俯视角、虚拟制片、Archviz、移动端等。很多人随手选个第三人称就开始做结果发现项目里默认开了Lumen、虚拟阴影贴图、时序超分辨率一套组合拳下来中端显卡直接跪。我的建议是如果你做的是移动端或者中低配PC项目直接选“空白”模板或者“移动端”模板。空白模板不会给你塞任何多余的后处理体积和默认材质移动端模板则默认关闭了Lumen和Nanite渲染路径走的是Forward Shading对GPU友好得多。如果你做的是PC高端项目第三人称模板可以选但进去之后第一件事就是检查项目设置里的渲染选项。具体路径是Edit → Project Settings → Rendering。这里有几个关键开关Dynamic Global Illumination Method默认是Lumen如果不需要动态GI改成None或者Screen Space。Lumen的GI开销在复杂场景里能占到GPU时间的30%以上。Reflection Method默认也是Lumen同样改成Screen Space或者None。Lumen反射在粗糙表面上噪点明显而且开销不小。Shadow Map Method默认是Virtual Shadow Maps这个在Nanite场景里效果很好但显存占用高。如果场景里没有大量Nanite资产改成Shadow Maps传统CSM更划算。Anti-Aliasing Method默认是TSR时序超分辨率效果比TAA好但开销略高。移动端建议改成FXAA或者MSAAPC中端卡可以保留TSR但把Screen Percentage降到70-80。注意这些设置改完之后记得在DefaultEngine.ini里确认一下有时候编辑器界面改了但配置文件没同步打包出来还是默认值。2.2 目标硬件与可扩展性设置UE5有一套Scalability系统分Low、Medium、High、Epic、Cinematic五档。项目设置里有一个“Default Scalability Level”默认是Epic。如果你做的是手游或者要上Steam但目标用户显卡分布很广这个默认值必须改。我一般会在项目设置里把默认档位设成Medium然后在游戏里做一个画质选项菜单让玩家自己调。具体操作Project Settings → Engine → Scalability把Default Quality Level改成Medium。然后你可以在蓝图里用Get Game User Settings节点动态调整。另外移动端项目一定要在Project Settings → Platforms → Android/iOS里检查纹理压缩格式和最大纹理尺寸。默认的ASTC压缩在安卓上兼容性最好但如果你用了大量UI贴图记得把UI纹理单独分组用ETC2或者RGBA8888不然UI会糊。还有一个容易被忽略的点Shader编译缓存。UE5默认在打包时会编译所有Shader变体如果你的项目里材质很多打包时间会非常长。可以在Project Settings → Packaging里勾选“Share Material Shader Code”和“Shared Material Native Libraries”能显著减少包体和编译时间。3. 引擎默认设置里必须改的几项3.1 渲染相关的关键参数进入编辑器之后哪怕你项目设置改过了还有一些运行时设置需要确认。打开Console Command输入r.ScreenPercentage默认是100但如果你开了TSR实际上渲染分辨率是动态的。我建议在DefaultEngine.ini里显式设置[/Script/Engine.RendererSettings] r.ScreenPercentage100 r.TSR.ScreenPercentage80 r.Lumen.GlobalIllumination0 r.Lumen.Reflections0 r.Nanite0 r.Shadow.Virtual.Enable0这几行配置的意思是关闭Lumen的GI和反射、关闭Nanite、关闭虚拟阴影贴图。如果你确实需要Nanite那就保留r.Nanite1但要把r.Nanite.MaxPixelsPerEdge调大默认是1.0改成2.0或4.0能减少Cluster数量提升性能。关于Nanite的一个常见误区很多人以为开了Nanite就自动优化一切实际上Nanite对植被、半透明材质、骨骼网格体的支持有限。如果你的场景里大量使用SpeedTree或者带骨骼的树木Nanite反而会增加开销。这时候应该用传统的LOD加Billboard方案。3.2 物理与碰撞设置UE5的物理引擎默认是Chaos比UE4的PhysX在复杂场景下性能更好但也有一些坑。Project Settings → Physics里有一个“Enable Enhanced Determinism”默认关闭。如果你的项目不需要确定性物理模拟比如回放系统保持关闭就行开了会增加CPU开销。碰撞方面移动端项目一定要把“Enable Complex Collision”关掉用简单碰撞体代替。复杂碰撞在移动端CPU上开销很大尤其是当场景里有大量可交互物体时。具体路径Project Settings → Physics → Simulation取消勾选“Enable Complex Collision”。另外Collision Profile的设置也很关键。默认的“BlockAll”和“OverlapAll”在大型场景里会导致大量无用的Overlap事件。我一般会自定义几个Profile比如“Pawn”只和“WorldStatic”和“WorldDynamic”碰撞“Projectile”只和“Pawn”和“Destructible”重叠。这样能减少物理线程的负担。3.3 内存与流送设置UE5的流送系统默认是“Texture Streaming”在开放世界项目里必须开但参数要调。Project Settings → Engine → Streaming里有几个关键参数Pool Size默认是1000MB对于移动端来说太大了。安卓中端机建议设成512MBiOS可以设成768MB。Max Texture Size默认是0不限制移动端建议设成2048PC中端可以设4096。Streaming Distance默认是0自动可以手动设成5000-8000根据你的场景大小调整。还有一个隐藏坑UE5的“Virtual Texture”默认是开启的如果你的项目里没有大量地形或者需要流送的纹理建议关掉。Virtual Texture会增加一层间接寻址在移动端GPU上开销明显。路径Project Settings → Rendering → Virtual Textures取消勾选“Enable Virtual Texture Support”。4. 实操流程从新建项目到性能基线测试4.1 新建项目并应用基础配置我一般会按这个流程走一遍打开UE5选择“游戏”分类下的“空白”模板项目名用英文路径不要有中文和空格。进入编辑器后先打开Project Settings按上一节说的改Rendering、Physics、Streaming。在Content Browser里新建一个文件夹叫“Core”里面放一个GameMode、一个PlayerController、一个GameInstance。这些是后面做性能监控的基础。打开DefaultEngine.ini把之前提到的配置行加进去。注意如果你用的是UE5.3以上版本有些CVar名字变了比如r.Lumen.GlobalIllumination在新版里是r.Lumen.DiffuseIndirect.Allow具体查一下官方文档。保存所有设置重启编辑器。重启之后打开一个空场景按~打开控制台输入stat unit看看Game、Draw、GPU三者的耗时。一个空场景在PC上应该是Game2ms、Draw1ms、GPU3ms。如果GPU超过5ms说明你的默认设置还有问题回去检查是不是Lumen没关干净。4.2 建立性能监控HUD在项目初期就做一个简单的性能监控HUD比后期用外部工具方便得多。我一般会在PlayerController里加一段蓝图用Get World Delta Seconds算FPS。用Get Game Time in Seconds配合stat unit的输出来看帧时间。在屏幕上用Draw Text显示FPS、Draw Call数量用stat scenerendering获取、以及当前Scalability档位。更专业的做法是用Stat Command系统在DefaultEngine.ini里加[SystemSettings] stat unitTrue stat scenerenderingTrue stat memoryTrue这样打包出来的Development版本也会显示这些统计信息。注意Shipping版本不要开会影响性能。4.3 移动端项目的额外步骤如果你做的是安卓项目还需要做这几件事在Project Settings → Platforms → Android里把“Minimum SDK Version”设成26以上“Target SDK Version”设成33。在“Advanced”里勾选“Enable Full Screen Immersive”取消勾选“Enable Vulkan”除非你确定目标设备都支持Vulkan否则OpenGL ES 3.1兼容性更好。在“Texture Compression”里把默认格式设成ASTC然后针对UI纹理单独建一个分组用ETC2。打包一个Development版本用adb连接到手机跑adb logcat | grep UE看有没有性能警告。我实测下来一个中等复杂度的场景在骁龙870上如果Lumen和Nanite都关了Screen Percentage设成80能稳定跑60帧。如果开了Lumen直接掉到25帧而且手机发热严重。5. 常见问题与排查技巧5.1 改了设置但打包后没生效这是最常见的问题。原因通常是编辑器里的Project Settings改了但DefaultEngine.ini里没有同步或者打包时用了Cooked版本的配置覆盖了。解决办法改完设置后手动打开DefaultEngine.ini确认一遍然后在打包前执行“Project → Package Project → Build Configuration → Development”不要用Shipping因为Shipping会剥离很多调试信息。另外有些CVar在打包后会被强制重置比如r.ScreenPercentage在移动端会被设备分辨率覆盖。这时候需要在GameInstance的Init里用Execute Console Command重新设置一遍。5.2 帧率波动大GPU和Game耗时都不高这种情况通常是Shader编译卡顿或者垃圾回收导致的。UE5的Shader编译是异步的但如果在游戏过程中动态加载了新材质就会在主线程编译导致卡顿。解决办法在项目设置里开启“Shader Compilation”的“Async Compilation”并且在打包时预编译所有Shader变体。垃圾回收方面UE5的GC默认是每60秒一次如果场景里Actor很多GC耗时能到几十毫秒。可以在DefaultEngine.ini里调[/Script/Engine.GarbageCollectionSettings] gc.TimeBetweenPurgingPendingKillObjects120 gc.MaxObjectsInEditor500000把GC间隔拉长到120秒同时增加对象上限能减少GC频率。但注意这会导致内存占用上升移动端要谨慎。5.3 移动端触摸事件响应慢UE5的触摸事件默认走的是“Slate”系统在移动端上如果UI复杂响应会慢。我一般会把触摸事件直接绑到PlayerController的Input里用Touch1、Touch2这些事件而不是用UMG的Button。UMG的Button在移动端上每次点击都会做一次Hit Test如果UI层级深开销很大。另外双指触摸在UE5里需要手动开启。Project Settings → Input → Mobile里勾选“Enable Gesture Recognition”然后在蓝图里用Get Input Touch State节点处理双指。实测下来双指缩放的响应延迟能从200ms降到50ms左右。5.4 碰撞盒识别不到Overlap事件这个问题我遇到过好几次通常是因为碰撞通道设置不对。检查步骤确认碰撞盒的Collision Preset里Object Type和Other Type的响应是Overlap。确认碰撞盒的Generate Overlap Events勾选了。确认碰撞盒的Collision Enabled是“Query Only”或“Query and Physics”。如果碰撞盒是附在骨骼上的确认骨骼的Physics Asset里对应的Body有碰撞。还有一个隐藏坑如果碰撞盒的Scale是负数Overlap事件不会触发。这个在UE5里没有警告但就是没反应。检查一下Transform里的Scale确保都是正数。5.5 多播委托导致性能下降UE5的多播委托Multicast Delegate用起来很方便但如果绑定了大量函数每次广播都会遍历所有绑定开销不小。我一般会限制单个多播委托的绑定数量在10个以内超过的话就改用事件队列或者消息系统。另外动态多播委托Dynamic Multicast Delegate比静态多播委托慢因为动态的需要在运行时查找函数名。如果不需要蓝图绑定尽量用静态的。6. 性能基线测试与持续监控6.1 建立可复现的测试场景性能优化最怕的就是“感觉快了”所以必须有一个可复现的测试场景。我一般会建一个“PerfTest”关卡里面放一个固定视角的Camera位置和旋转写死。100个静态网格体用不同的材质。10个带骨骼的Actor做循环动画。一个粒子系统持续发射。一个UI显示FPS和Draw Call。然后写一个自动化脚本用Automation系统跑这个关卡记录帧时间。UE5的Automation系统支持“Perf”类型的测试可以在Project Settings → Automation里配置。6.2 用Unreal Insights做深度分析Unreal Insights是UE5自带的性能分析工具比stat命令详细得多。启动方式在编辑器里打开“Tools → Unreal Insights”然后运行游戏Insights会抓取CPU和GPU的Trace。我一般会关注这几个Trace事件GameThread看有没有长时间的Tick或者蓝图逻辑。RenderThread看Draw Call和RHI的耗时。GPU看各个Pass的耗时尤其是BasePass、Lighting、PostProcess。如果GPU的BasePass耗时高说明材质复杂或者Overdraw严重。如果Lighting耗时高说明动态光源太多。如果PostProcess耗时高说明后处理体积里的效果开太多了。6.3 持续集成里的性能检查如果你的项目用CI/CD可以在每次提交后自动跑一次性能测试把结果和基线对比。UE5支持命令行运行Automation测试UnrealEditor-Cmd.exe ProjectName.uproject -ExecCmdsAutomation RunTests PerfTest; Quit -TestExitAutomation Test Queue Empty -ReportOutputPathPerfReport然后解析报告如果帧时间超过基线10%就报警。这样能在早期发现性能回归而不是等到版本末期。7. 一些零散但重要的经验7.1 关于UE5的Linux支持UE5的Linux版本在服务器端渲染和云游戏场景里用得比较多。如果你要在Linux上跑UE5注意几点首先Linux版默认没有编辑器只有命令行工具其次Linux上的GPU驱动对Vulkan的支持比OpenGL好所以建议用Vulkan RHI最后Linux上的Shader编译比Windows慢建议在Windows上编译好再拷过去。7.2 关于Julia性能优化与内存管理的类比虽然Julia和UE5是两个领域但性能优化的思路是相通的。Julia里讲究“类型稳定”和“避免全局变量”UE5里讲究“避免每帧分配”和“减少蓝图Tick”。核心都是减少运行时的不确定性。我在UE5里做优化时经常会想这个操作如果放在Julia里会不会导致类型不稳定如果会那在UE5里大概率也会导致Cache Miss或者分支预测失败。7.3 关于QCandlestickSeries性能优化的启发QCandlestickSeries是Qt里的K线图组件它的性能优化主要靠“数据分块”和“视口裁剪”。这个思路在UE5里同样适用如果你的场景里有大量Actor不要一次性全部Tick而是根据距离和视锥体做分块更新。UE5的“Significance Manager”就是干这个的可以根据Actor的重要程度动态调整Tick频率。7.4 关于UE5教程Linux的补充如果你在Linux上学习UE5推荐用Ubuntu 22.04 LTS显卡用NVIDIA的 proprietary驱动不要用开源驱动。另外Linux上的UE5编辑器需要手动编译过程比较长建议用make -j$(nproc)并行编译。编译完之后用./UnrealEditor启动如果报错缺库用ldd查一下依赖。7.5 关于怎么安装UE5这个问题看似简单但新手经常卡住。我的建议是直接用Epic Games Launcher安装不要用源码编译除非你需要改引擎代码。安装时注意磁盘空间UE5.3完整安装大概需要120GB加上项目缓存建议预留200GB。安装路径不要有中文和空格否则打包时会报错。7.6 关于UE5怎么更改语言编辑器语言在Editor Preferences → General → Region Language里改。但注意改了语言之后有些插件的UI不会跟着变而且中文翻译有时候不准确建议还是用英文界面遇到不懂的术语查文档。8. 一个可复用的项目设置检查清单最后整理一个我每次新建项目都会过一遍的清单你可以直接抄作业检查项路径推荐值默认GI方法Project Settings → RenderingNone移动端/ Lumen高端PC默认反射方法Project Settings → RenderingScreen Space移动端/ Lumen高端PC阴影贴图方法Project Settings → RenderingShadow Maps非Nanite场景抗锯齿方法Project Settings → RenderingFXAA移动端/ TSRPC默认可扩展性档位Project Settings → Engine → ScalabilityMedium复杂碰撞Project Settings → Physics关闭移动端纹理流送池大小Project Settings → Engine → Streaming512MB移动端/ 1000MBPC虚拟纹理Project Settings → Rendering关闭除非地形巨大Shader编译缓存Project Settings → Packaging开启Share Material Shader CodeGC间隔DefaultEngine.ini120秒这个清单不是死的根据你的项目类型调整。但核心原则不变默认设置是给Demo用的不是给项目用的。每开一个新项目花半小时把这些过一遍后面能省几十个小时的调试时间。我在实际项目里发现很多性能问题不是引擎的锅而是项目设置从一开始就错了。比如有个项目做了半年才发现默认开了Lumen关掉之后帧率直接翻倍。所以别急着做内容先把地基打牢。
返回列表