1. 先搞清楚UE5性能优化到底在优化什么拿到“UE5性能优化”这个题目很多人的第一反应是调整画质参数、砍阴影、降分辨率。但我的体会是UE5的优化逻辑和UE4时代已经有很大不同很多人优化半天没效果就是还在用旧思路测新引擎。先说说UE5和UE4渲染层面的本质差异。UE5默认开启了Lumen全局光照、Nanite虚拟化几何体、Virtual Shadow Maps虚拟阴影贴图这套组合在视觉上非常震撼但它对硬件的压榨也远超UE4的传统管线。Nanite不是传统意义上的模型减面工具它做的是“运行时流送”你放进场景里的数百万三角形引擎会自动按视距和屏幕占比裁剪最终提交给GPU的三角形数量其实并不多。这意味着你在场景里摆放高模的时候完全可以丢掉原来的“三角面预算”直觉但这不代表一切变得简单——Nanite把压力从“模型面数”转移到了“BW纹理带宽”和“GPU光栅化负载”上。再说Lumen。Lumen是做实时全局光的它利用软件光追和硬件光追混合的方式把场景的间接光算得又快又亮但代价是极高的GPU计算压力。尤其是有大量动态光源和可移动物体时Lumen的反复解析开销会非常惊人。移动端想跑Lumen按照现在主流中端芯片的算力真的是很吃力。我的意思是UE5的优化工作本质上是在这些新技术的高质量渲染和硬件承受力之间找平衡。项目设置阶段实际上是在定义这个平衡的底线。项目设置如果乱了后面不管你怎么砍材质、减模型都只能在失控的框架里打补丁。这也是为什么我在这个系列的第一篇就把“基础与项目设置”放最前面的原因——它决定你整个项目未来的性能天花板。适合看这篇的人我觉得有两类。一类是刚接触UE5、准备把项目从UE4迁移或者新起一个项目的开发者你需要在项目还没产出大量资产之前把基础设置打好避免后面返工。另一类是自己做游戏、做建筑可视化、做影视预演的个人开发者这类项目硬件参差不齐经常需要在画质和帧率之间反复权衡项目设置阶段的事情值得认真过一次。我不喜欢绕弯子下面直接进入正题说说我在项目设置阶段会做的几项关键操作以及每一项目设置背后的逻辑。看不懂的地方我会用类比解释清楚。2. 项目设置阶段的必做清单先定平台和画质底线加载任何一个项目打开Project Settings能找到上百个选项很多人刚看到就晕了。这里有一份自己的清单我建议你按下述顺序过一遍项目设置这个顺序背后是有逻辑的由平台决定硬件上限由硬件上限决定渲染方案再由渲染方案决定画面参数。反了就容易出麻烦。2.1 目标平台设定你的优化基准线第一步在Project Settings里找到Targeted Hardware级别这个选项有好几个档位比如High/Medium/Low也可以自定义。如果你是做PC端游戏这步可以暂时不管直接用Desktop但如果你是做移动端千万别跳过。这个级别直接影响UE5的默认材质质量、纹理流送池大小和阴影质量预设。这里有一个实操上的心得我见过很多团队项目做了一半才想起要上线手机结果发现场景里到处是高质量纹理和法线细节移动端根本带不动回头看基础设置才发现当时全用了Desktop默认值。建议在项目创建的第一天就明确要不要上移动端哪怕你计划做完PC版再说也先把Targeted Hardware定成Mobile级别跑一版看效果后面再调回来也来得及。在Rendering一栏里还可以设置DirectX Shader Model版本、OpenGLES版本、Vulkan Desktop Mobile这几项这些影响的是底层的渲染API。移动端目前主流是VulkaniOS这边是Metal。UE5把默认设置改成了Auto大部分情况能自适应但如果你的项目要上老一点的安卓机建议手动把OpenGL ES3.1勾上因为有些老显卡对Vulkan的支持并不好会直接花屏或者崩。2.2 帧率目标优化之前先回答“你要跑多少帧”帧率目标是性能优化的最终锚点。没有帧率目标就开始调项目设置就像开车没目的地只看油表永远不知道踩多少油门合适。常见的目标有三档主机和PC单机游戏通常是30帧帧生成时间33.3ms竞技类PC游戏、格斗游戏是60帧帧生成时间16.6ms移动端休闲游戏往往锁30帧中高端手机可以尝试60帧但老实说在资源有限的项目里模板制作的美术资产很难在60帧下稳住。在Project Settings-General-Frame Rate里可以设置Smoothed Frame Rate和Fixed Frame Rate。这里有个很多人不知道的细节UE5默认的Fixed Frame Rate是0代表不锁帧理论上它跑得越快越好。但如果项目要上Switch这类便携平台或者要做云渲染强烈建议固定目标帧率比如30或者60让引擎的时序系统按这个节奏分配资源。再补充一个帧生成时间的知识。你看到的31.5ms帧生成时间其实就是1/31.75秒画面每秒只更新31、32次人眼会觉得卡顿明显。很多发布会上的UE5大作都不是60帧运行而是靠30帧强掩盖技术运动模糊、TAA来维持视觉流畅这在PC端可以接受但在多人竞技或操作精度要求高的游戏上非常影响手感。这算是我个人建议单机项目锁30帧可行但多人项目尽量奔60帧去。2.3 渲染方案Forward还是DeferredRendering-Rendering Path那里有个Forward Shading Platform选项默认是Deferred。两种渲染路径直接决定你的画面表现和优化策略。Deferred Shading延迟渲染可以容纳大量光源但它把光照信息存在G-Buffer里非常吃显存带宽。UE5的Lumen全局光方案本身依赖G-Buffer所以桌面端多光源场景Deferred更合适。Forward Shading前向渲染在很多旧式手机上更友好带宽占用低对移动端的GPU压力小但它在场景光数量多的时候性能崩得厉害而且需要手动处理MSAA抗锯齿。这里给一个实战建议移动端项目特别是用BP蓝图做小玩法但有大场景底子的项目可以考虑开Forward除非你要用Lumen。Lumen和Forward基本不兼容一开ForwardLumen就是用不了。所以我的选择逻辑是要Lumen就选Deferred放弃移动端不要Lumen可以尝试Forward或者Deferred低配置。2.4 阴影与反射一低一高阴影在UE5里的设置有两块要重点盯Shadow Map Method阴影贴图方法和Virtual Shadow Maps虚拟阴影贴图。VSM是UE5新增的默认项它配合Nanite可以把非常高精度的阴影覆盖到几公里外效果确实好但内存开销真不小。中小型独立项目的经验是投影范围远、场景复杂度高的地方用VSM到了室内小场景反而建议关掉VSM回退到传统Shadow Maps。因为VSM在大量半透明物体、特定版本和特殊材质组合下有一定概率出现阴影闪烁排查起来非常费劲。反射这一块UE5默认开的是Screen Space Reflections屏幕空间反射品质如果拉太高在移动端会很浪费。如果是建筑可视化类项目画面里镜面和玻璃很多建议改成Lumen Reflection甚至可以考虑Planar Reflection做局部高质量反射但注意性能。做游戏的话我倾向于把反射品质调中低用简洁贴图加CubeMap做假反射大家看到的游戏画面里大多数高光表面其实不是“真反射”而是“假环境贴图”。2.5 全局光照方案Lumen还是烘焙光照这里我想特别强调一下UE5推出Lumen之后很多人以为项目设置里全勾Lumen就行了其实这里面的坑很大。Lumen在项目设置里的路径是Rendering-Global Illumination-Method常用选项有Lumen和Static/ Precomputed。很多场景比如室内、洞穴、地下城其实非常适合用Precomputed烘培。因为这些场景的光照是静态的烘培出来的Lightmap效果稳定、消耗极低可以留给动态角色、动态光源更多GPU算力。反过来Lumen适合动态开放世界、一天时间变化、频繁拆墙改变地形这类“没法烘培”的场景。我的个人建议是不要一上来就全场景开Lumen。你可以在项目里划分区域大的开放空间用Lumen带门、带墙的室内空间用区域复制LoadStreamingLevel配好烘焙Lightmap这样动静结合性能和画面兼得。关于动态场景怎么判断是否需要Lumen有一个实际判断标准如果场景里的光源、门、墙、家具大部分是静态的就选烘焙90%以上物件都能动、天色能变这时候才真的需要Lumen。2.6 可扩展性设置Scalability给不同机型留好后路项目设置里最关键的还有一处可能很多新手没注意到——Scalability Quality Levels。它在Project Settings-Engine-Rendering- Scalability这个板块里。你在这里定义低/中/高/史诗四档分别对应什么画质这样不同配置的玩家启动游戏时引擎可以根据硬件自动切档。操作方法是在编辑器的右下角Settings里选Low/Medium/High/Epic调整对应的参数比如阴影分辨率、视图距离、后处理质量然后打开Scalability设置页可以看到它生成了一系列.ini配置把这些配置保存到项目Config目录。这个操作的价值是你不用给每个玩家手动调画质。引擎会根据CPU核数、显存容量、内存大小自动选择适配合适的档位。我在移动端项目里常用的策略是做一个中档做基准高档给高端机顾客低档给内存小于4GB的老设备。用一句话说项目设置阶段做的Scalability配置相当于先给你所有的目标用户画好了性能地图。3. 怎么给移动端项目做“降维”设置很多朋友私信问我手游性能优化怎么做。这个话题真是一两天说不完的但我在项目设置阶段有一套自己的固定打法分享出来。3.1 认清移动端最贵的两样东西带宽和发热手机GPU和PC GPU有个本质区别手机GPU几乎完全受限于内存带宽。理论上芯片可以在1秒内算几十亿次浮点运算但数据从显存DRAM搬进GPU的速度带宽远远跟不上计算速度。这意味着优化移动端项目第一思路永远是“减少数据搬运”而不是“提升计算效率”。贴图压缩、降低纹理尺寸、减少Overdraw、合理使用MipMap本质都是在帮带宽减负。发热是另一个隐形瓶颈。手机芯片都有持续功耗限制一般跑上3-5分钟芯片为了不烫手会主动降频。降频以后画面帧率会从60一路掉到30甚至更低。我现在遇到很多问题都是“刚测试的时候满帧半小时后就卡成PPT”这不是设备坏了是热降频在捣乱。所以在项目设置里要有意识地把高端GPU功耗控制在中低水平预留一些性能余量让长时间游戏时帧率能稳住。3.2 纹理、材质与渲染分辨率三座大山纹理压缩格式上市面安卓机基本都支持ASTCiOS也全线支持。项目设置里把纹理压缩格式统一切到ASTC之后建议顺手把最大纹理尺寸限制成2048或者1024个别UI图可以保留4096但场景大背景贴图真的没必要4K。这里有个真实案例我接手过一个优化项目一条小街道的场景里贴了十张8K纹理我全换成2K后帧数直接从20帧提到35帧画面几乎看不出区别。材质方面有很多新人在手机上用了没做移动端适配的Master Material例如同时混合了Clear Coat、Subsurface、Anisotropy之类的高级特性这些特性在桌面端是加分项在移动端就是显卡杀手。记得在项目设置里把Use Mobile Shading高版本设为启用并针对Moblie材质单独出一版简化材质函数。渲染分辨率方面我建议移动端项目要开一下r.ScreenPercentage。比如你用默认100%分辨率渲染可以尝试调整到80%或70%再叠加Temporal Upscale比如AMD的FSR或虚幻自带的TAAU画面在手机上观感损失很小帧率提升非常明显。预算紧的项目这个调整往往比复杂的材质优化性价比高十倍。3.3 用LOD和剔除减少看不见的东西移动端项目一定要开Hierarchical LOD系统HLOD。这个系统能把大片低模合并成一个网格体大幅减少场景中的Draw Call。项目设置里有一项NumerOfHLODOverride可以调生成HLOD的等级数根据场景规模适当调低配合World Partition一起使用效果非常好。剔除也不能忽略。默认的视锥剔除和遮挡剔除已经开了但在项目设置-Engine-Culling里可以优化OcclusionCullSettings。移动端项目强烈建议勾选View Depth Test Before Image Read、BetterOcclusionModel之类的选项这会提前把被遮挡物体剔除掉减少无效渲染。室内场景尤其香。说到底移动端优化的先天原则是尽量不渲染不需要的东西尽量只搬运必要的数据。项目设置只是第一步真正的大头在美术资产的整理和底层渲染策略上。4. 常见性能瓶颈与排查思路完成项目设置之后正儿八经的性能评估和调试才刚开始。性能优化不能靠猜、靠感觉要用工具看数据。我这里整理一下常用排查工具和我的判断流程。4.1 stat命令组快速定位高负载模块UE5编辑器里按下“输入一个命令”就是stat。最有用的几个stat GPU在画面左上角显示Draw Call、三角面数、渲染线程耗时。如果Draw Call上万大概率是有超多小物体没合批如果三角面数几千万级别大概率是Nanite负载高或者模型过多。stat CPU显示游戏线程和渲染线程耗时。如果游戏线程超11ms说明蓝图逻辑或物理解算出问题如果渲染线程超16ms一般是场景绘制过多或粒子系统复杂。stat Memory显示内存占用。如果LevelStreaming部分显示Memory非常高可能是加载了太多子关卡没释放。stat Streaming看纹理流送的情况看Cached In Top和Pending合计的值。如果Pending长期很高说明带宽不够要降低贴图规格或者降低Streaming Pool Size。4.2 Unreal Insights看时序才能发现慢性问题Unreal Insights是官方推出的性能分析工具Trace工具trace了引擎各模块的耗时。我建议你开启Trace的GameThread和RenderThread两条链路跑一段实机能清晰看出是游戏逻辑卡还是渲染堆料卡。有很多时序上的问题用stat确实看不完全比如两帧之间突然加载大量资产导致的卡顿在stat里看到的只是GPU占用低真正的罪魁是I/O读取等待。Unreal Insights有一个特别好的功能它会把帧生成时间的波动以图表形式呈现你能非常直观地看到某个峰值出现在什么时间点再结合这个时间点上下文的关卡加载、事件触发很容易定位问题。4.3 找瓶颈的三个层级我在排查性能时习惯从三个层级往下钻第一层看整体帧时间构成。CPU耗时多少毫秒GPU耗时多少毫秒。谁高谁就是主要瓶颈。正常情况下游戏线程和渲染线程都要控制在某个阈值以下。第二层如果GPU是瓶颈用ProfileGPU命令或者GPU VisualizerGPU可视化面板去看哪些Pass开销最大。常见高开销Pass有Lumen反射、屏幕空间反射、半透明体积、后处理Bloom、抗锯齿。对应地调整Pass设置再测。第三层如果是CPU瓶颈把主要耗时按Gameplay、ActorTick、物理、动画、导航来分类。蓝图越用越多游戏线程膨胀是新手项目最常见的问题。比如一个敌人AI控制蓝图每帧跑很多GetActorLocation和LineTraceByChannel调用就是CPU杀手。4.4 一个典型排查案例举个例子一个UE5场景无论怎么调整画质帧率都卡在25-30帧上下。我打开stat GPU发现Triangles大得离谱。再开到nanite visualization模式发现场景里有一个导入的“高精模型”在屏幕外的地方因为有刷子残留的SubInstance它仍然在被完整渲染。把它替换成Nanite所接纳的更合理网格然后设置LOD距离帧率直接跳到45帧。又比如另一个移动端项目频繁卡顿。我开StatMemory看到Memory Overallocation很多检查了纹理流送池发现默认的Streaming Pool Size是1000MB手机上根本扛不住改到512MB同时把所有UITexture做Imposter处理问题马上缓解。说到底排查思路就是“先看整体再拆局部”哪个环节冒头就优化哪个。项目设置能解决的尽量别用后期优化补齐前期的遗漏。5. 几个容易被忽略的细节材质、蓝图逻辑和加载策略到了这一节聊几个跟性能有点关系、但又容易被忽略的细节。这些都是我在各家项目里被反复问过的问题也在实际开发中踩过坑。5.1 刀光材质Niagara特效真的是性能刺客很多玩家喜欢炫酷的刀光、拖尾、挥击特效一个Niagara特效用了几百个粒子每个都是半透明材质GPU负担极大。半透明叠加Translucency的渲染方式本来就比不透明多几种Pass粒子一多Overdraw秒变灾难。我踩过的一个坑是一个近战游戏里每次挥刀触发一个Niagara系统粒子数量500粒子寿命很短但因为半透明材质里又加了扭曲、折射、深度预读取之类帧数直接往下掉8-10帧。换成简化材质、粒子数降低到120视觉上其实没差多少。老实讲态度鲜明一点特效好看不是靠堆粒子是靠合理的颜色层次和材质设计。做刀光特效注意在项目设置里把Effect-ScalabilityQualityLevels设成Middle档然后单独测试一次看FPS变化。这是避免“大招一出全场卡爆”的必经之路。5.2 开关门蓝图的常见卡顿点很多人做门的基础蓝图喜欢在Event Tick里每帧检测玩家和门的距离一检测到近就直接PlayAnimation。听起来没问题但Tick频率跟场景里门的数量成正相关几十扇门就相当于每帧多跑几十次距离计算碰撞检测。优化方法很简单用Sphere Collision Box或者用Timer定时检测隔0.1秒查一次距离再或者利用BeginOverlap事件玩家走进范围才触发开门的流程。有人问蓝图和C哪个优化空间大。我个人的态度是逻辑量小用蓝图没有任何问题逻辑量大、频繁调用比如每一帧、每一次交互都要跑复杂数学计算就迁到C或者用数据驱动的方式预计算。项目设置阶段可以勾选Blueprint Efficiency的Show stats用蓝图调试器看看高频调用函数占了多少帧时间。有这个习惯以后你会发现很多代码完全可以在事件回调里做而不是死磕Tick。5.3 网络同步与性能的关系如果你做多人联网游戏项目设置里的Netcode设计很影响性能。像Net Update Frequency决定了角色位置的更新频率频率越高越吃带宽。在移动端多人游戏中这个值要小心权衡。我常用的做法是玩家附近高频同步远程玩家用InterpolationHook延迟同步减少不必要的数据流量。在项目设置中可以打开DefaultReplicationFrequency的默认值并针对不同客户端做LevelOfDetail同步高低频率分开。这个点跟画面优化无关但在游戏体验上的影响一样巨大值得专门出一篇系列文章拆开讲。5.4 内存管理与Julia性能优化的类比有人问到“Julia性能优化和内存管理”这类词条其实可以拿做类比。UE5就像一门高级语言你用起来方便只要没做底层优化耗电量、内存占用就上去了。Julia也一样随着你不断循环生成数组、创建对象布局不好时性能就会崩。做UE5性能优化的时候除了处理项目设置把内存管理意识放在第一位——控制分配、预分配、复用对象永远好过边跑边new。这一条对所有引擎通用。在做项目设置的时候可以顺手打开Default Settings里的Memory Pool配置把可能用到的动画资产和关卡资源预加载而不是每个玩家进入后临时加载能有效减少卡顿。6. 我做过的项目设置实战复盘再聊一个具体的实战复盘过程给大家一个“可以直接抄作业”的流程。某次我负责一个小型移动端RPG项目目标是流畅跑在中低端安卓机上并尽量保持不错的画面。我按下面这套流程走完项目设置整个再跑通一版样片测试。第一步把Targeted Hardware细节调成Mobile级别RenderingPath设为Forward关掉Lumen改用烘焙光照刻意压低全局光照的消耗。第二步材质、贴图设定ASTC覆盖所有纹理把大贴图切到2K以下限制UI贴图分辨率所有主材质重新做Mobile简化版本去掉透明度和复杂光照输入。第三步阴影方案关掉虚拟阴影贴图VSM退回传统阴影贴图SM3动态阴影数量降一半静态场景全部预烘。第四步可扩展性设置定义Low/Mid/High档位写进Scalability.ini。Low档全画质关抗锯齿Mid档开TAAHigh档保留一定反射和景深。第五步做一次性能实测。在Pixel2的目标手机上测试结果中低档位28-32帧高档位22-25帧。然后我把ScreenPercentage从100调到80加TAAU中档位立刻爬到35-38帧高档位也能稳定到32帧左右画面观感依然OK。这组数据说明项目设置阶段的调节效果往往比后期单独优化某个模块来得直接。当然后续场景复杂度上来之后还要继续做LOD、遮挡剔除和纹理流送的细部优化但至少开头这波操作把性能的“地基”打牢了。7. 一个少有人提但很关键的经验用“帧预算分配表”管理性能余量项目设置做完以后我强烈建议你为团队做一张“帧预算分配表”。这不是引擎里的功能而是团队内部用来管理优化优先级的一个文档。做法很简单你先定好目标帧时间比如30帧33.3ms然后按系统拆分配置游戏逻辑预留5ms物理碰撞2ms动画系统3ms渲染线程8msGPU渲染12ms其它杂项3ms总计33ms。每一块超支就去找对应系统的负责人优化而不是让整个项目组一起焦虑。我发布这套表格后团队很快就找到一个核心性能问题实际上是GPU渲染超了4ms之前大家却一直在调蓝图逻辑。项目设置阶段做了这种“预算表”整个团队的优化目标会变得超清晰也很少有吵架和甩锅的混乱。写这个项目的系列笔记时我会陆续更新后面章节比如材质优化实操、Niagara特效调优、移动端进阶技巧、网络同步优化、C/蓝图分工等。第一篇里提到的项目设置内容算是我个人在优化这条路上走得最稳的一条路先把地基打牢再谈上层装修。最后再分享一个自己很原始的体会做优化没有一步到位的灵丹妙药。项目设置阶段做对了后面会省很多心做错了后期就要反复打补丁甚至可能动结构。与其亡羊补牢不如项目第一天就拿出一个小时认真过一遍这些设置性价比极高。