UE5项目做到中期大家最常问的一句话往往是“怎么这么卡”。前阵子我整理自己项目的性能优化笔记发现最容易被忽略的恰恰是最基础的东西——项目设置。很多人一上来就开Lumen、开Nanite、拉高阴影质量结果帧率直接崩盘然后又一头扎进复杂的渲染优化里忘了回去检查自己最初埋下的雷。这篇笔记就是记录我从零开始整理UE5性能优化的第一条线基础概念和项目设置适合刚接触UE5、准备做PC或移动端项目的朋友也适合那些项目已经开始掉帧、但还没系统梳理过项目设置的老手。1. 先把帧预算算明白再动任何一个项目设置1.1 一帧只有这么多毫秒可以花性能优化的第一步从来不是调参数而是建立帧时间观念。UE5里一帧画面从生成到显示时间大概是1000毫秒除以目标帧率。做PC 60帧项目一帧预算就是16.6毫秒做主机30帧项目预算大约33.3毫秒移动端如果目标是30帧预算同样是33.3毫秒但如果目标60帧一帧就只剩16.6毫秒。这里的恐怖之处在于移动端GPU和PC GPU完全不是一个量级用PC上16毫秒能渲染的复杂度去套移动端帧率直接个位数。所以我建议拿到项目的第一件事就是写下一张预算表。目标平台目标帧率帧时间上限备注高端PC60 FPS16.6 ms可开启Nanite/Lumen部分特性中端PC30 FPS33.3 ms谨慎使用全局光照次世代主机30-60 FPS16.6-33.3 ms根据分辨率权衡移动端30 FPS33.3 ms默认关闭Lumen/Nanite有了这张表你后面做所有设置决定时都有依据某个选项吃掉了多少毫秒值不值一目了然。1.2 帧时间花在哪三个线程上UE5的帧时间不是“一个整体”而是由三块并行竞争的资源组成。Game Thread跑蓝图、AI、物理碰撞、角色移动逻辑。如果你场景里蓝图特别多或者每个Actor的Tick都在干活这里会先爆。Render Thread处理渲染命令比如收集可见物体、准备绘制调用。它夹在Game和GPU之间经常出现“隐藏瓶颈”。GPU真正画像素的硬件单元包括光照、阴影、材质、后处理。场景越复杂、分辨率越高GPU压力越大。很多刚接触优化的同学会犯一个错误只看总帧率不看瓶颈在哪。结果可能就是明明是GPU被后处理吃满了他反而在项目设置里关了阴影一遍操作猛如虎帧率纹丝不动。正确做法是先用后面讲的stat unit看时间分布确定瓶颈再回到项目设置里针对性地调。1.3 从热词项目里学到的优化视野我翻了一下最近检索到的UE5相关热词出现频率最高的几个是“手游性能优化”“性能优化实战”“UE5网络同步”“UE5蓝图入门”。这几个词其实暴露了一个规律大多数UE5开发者一边在学习基础功能一边已经背上了性能债。尤其“手游性能优化”和“项目设置”强相关——移动端项目在项目设置里的渲染选项很多默认值是必须改掉的。我这里提到它不是想跑题而是想说明项目设置不是只有PC项目才需要关心移动端反而是更加依赖项目设置的第一道关卡。2. Project Settings 里最影响帧率的开关逐个过一遍2.1 目标硬件与渲染模式一开始就定好别中途纠结在Edit → Project Settings → Platforms里第一步是明确目标平台。很多人觉得这里没什么用跳过结果后期要做移动端包时发现一堆PC特性关不掉拆东墙补西墙。核心逻辑其实很简单做PC项目你可以默认走Deferred渲染光源多、体积光、反射都方便视图上不容易出漏光。做移动端项目一定要在Rendering → Mobile Shading相关选项里确认走Forward渲染。移动端的GPU带宽小Deferred的GBuffer读写是很大开销Forward配上少光源场景会轻很多。如果项目是跨平台发布建议用Default RHI相关的配置区分平台或者在项目设置里给每个平台单独做一份渲染等级。实际项目里最稳妥的做法是直接从“最弱的平台”出发做配置强的平台再往上加。这样可以防止“PC上跑得爽一上手机就崩”。2.2 Lumen、Nanite、Virtual Shadow Map默认值不代表适合你UE5的最大卖点是Lumen全局光照、Nanite虚拟几何体、Virtual Shadow Map虚拟阴影贴图。但默认设置是针对“次世代级演示场景”的不代表适合你的项目。对于大多数中小型项目这三个功能按以下逻辑取舍Nanite适合高模场景比如用ZBrush雕刻的石头、建筑结构。如果你的场景是风格化低模、Low Poly或者大量使用植被和动态变形物体Nanite帮不上忙反而占内存。植被、布料、骨骼网格体很多情况下不支持Nanite特性硬开只会增加构建复杂度。Lumen吃GPU很凶尤其动态全局光照。做室内场景如果窗口多、光照变化频繁Lumen确实香但代价是帧率。中低端PC建议使用烘焙光照贴图代替移动端默认关闭。Virtual Shadow Map配合Lumen时效果很好但它会拉高阴影内存和Draw Call。如果场景内光源不多把阴影距离调短、用普通阴影贴图反而更稳。这里我建议你打开项目设置里的Rendering → Global Illumination和Dynamic GI选项逐个切换对比。不要凭印象要在实际场景里看帧率。2.3 抗锯齿、阴影、反射三个吃配置大户抗锯齿方面UE5默认的TAA或TSR很吃性能。TSRTemporal Super Resolution在PC上效果接近DLSS但对中低端显卡仍然有固定开销。如果你追求清晰锐利的低分辨率图片可以先从Anti-Aliasing Method里改成FXAA试试移动端更是建议FXAA或直接关。阴影方面项目设置里有Shadow Map Method和阴影分辨率。先检查每个光源的Shadow Resolution和Attenuation Radius不要用SpotLight跨半个地图照人。移动端可以直接把阴影质量整体下降一级很多手游项目最终跑的是“只有角色脚下一个小软阴影”观感并不差但性能省出一大截。反射方面Screen Space Reflections屏幕空间反射很吃GPU尤其全屏反射时每个像素都要做多次追踪。Reflection Capture反射捕捉开销低得多适合静止物体。在项目设置里把反射质量从“高”降到“中”通常肉眼难察觉但帧率能提升5%-10%。2.4 后处理链路Bloom、AO、Motion Blur 的细节项目设置再往下就是Post Processing Volume。很多人喜欢往场景里塞一整套“电影感”后处理Bloom Intensity拉到3、暗角拉到最大、再加景深和运动模糊。但每一项都是全屏运算布鲁姆要对高亮区域做多级模糊AO要做屏幕空间采样都是逐像素开销。我的建议是在项目设置里找到Reflections → Screen Space Reflections和Ambient Occlusion优先保证AO开启因为它对场景层次感贡献大而SSR可以酌情关闭。Bloom强度直接降档或者限制在爆炸、灯光闪烁等少量镜头出现不要常驻。Motion Blur移动端建议彻底关闭PC可以开低档因为动态模糊其实也掩盖不掉低帧率的卡顿感反而会让人更晕。3. 那些藏在内容层的设置剔除、LOD、纹理流送3.1 剔除距离看不见的东西不算数项目设置里的Near Clip Plane和Culling相关选项是很多人会忽略的“无痛优化点”。UE5默认的剔除距离相对保守很多情况下远处物体全都还在渲染。利用World Settings或每个Actor的Cull Distance Volume可以按物体类别设置剔除距离。操作逻辑是这样先确定你的场景视距最远是多少。比如俯视角手游最远看到200米那200米外的岩石、小物件、灌木丛全部可以剔掉。做成一个Cull Distance Volume放在场景中心引擎会自动管理。除此之外引擎里多一个Cull Volumes用于性能测试可以开启“自动生成HLOD”把远处小物体合并成代理网格。HLOD不是项目设置里碰运气的东西而是在World Settings里勾选LOD Settings让构建时自动生成大幅减少绘制调用。3.2 LOD与Nanite的配合不要以为开着Nanite就不用管LOD了。传统网格体Static Mesh依然需要设置LOD。很多美术在导入模型时只放了一个高模LOD数量是1引擎把所有距离的物体都按最高精度渲染——这是项目中非常常见的性能刺客。项目设置或资产细节面板里的Auto Generate LOD工具可以一键生成LOD 0、LOD 1、LOD 2。需要注意LOD切换不要只看距离还要看物体在屏幕上占据的像素大小。一个巨大的房子在500米外依然占很多像素LOD不能切太快。移动端建议每个静态网格至少三档LOD三角形的削减比例可以从50%开始试着切。植被这类大量重复的物体尽量使用Instanced Static Mesh或Hierarchical Instanced Static Mesh把多次Draw Call合并成一次。项目设置里没有直接开关但你在放置植被时就应该选对类型。3.3 纹理流送和内存预算纹理是显存和内存的大头。UE5默认Texture Streaming是开启的它可以让引擎只加载视野内需要的纹理贴图。问题在于很多人不改它的默认池大小导致贴图加载时频繁卡顿。项目设置里Engine → Rendering → Textures有Streaming Pool Size。如果你的项目贴图很丰富但显存只有6G建议把池大小调到2000MB左右如果显存高可以适当放大。注意池开太大也不代表更流畅反而会触发显存回收。另一个更直接的招是在纹理导入设置里把最大贴图尺寸限制在合理范围内。别把一张UI贴图做成4096背景木板用512就够。这里我没法替你定尺寸但有个原则人眼近距离看的才给高分辨率背景、重复贴图一律减半。4. 用 stat 系列命令做一次体检验证每一项设置4.1 控制台输入 stat unit先看清瓶颈项目设置改完最忌讳的就是“凭感觉觉得快了”。请在编辑器或打包后的运行时打开控制台输入stat unit你会看到类似这样的数值Frame、Game、Draw、GPU。这四项分别代表Frame总帧耗Game游戏线程耗时Draw渲染线程耗时GPUGPU耗时当你发现Game很高就去检查蓝图、物理、寻路当Draw很高优先查Draw Call和实例化当GPU高回到项目设置里找渲染特性和后处理问题。这套排查法能帮你精准定位而不是瞎调。4.2 stat gpu 与 stat rhi 的进一步定位如果确定瓶颈在GPU可以再输入stat gpu这里会列出每个渲染阶段的耗时比如BasePass、ShadowDepths、Translucency、PostProcessing。哪个项目高得离谱就重点检查对应环节。比如ShadowDepths高说明阴影分辨率太大或光源太多Translucency高可能是半透明材质太多。输入stat rhi能看到Draw Call数量。同一个场景如果Draw Call从几百变成几千基本上就是实例化没做好或者物体类型太碎。UE5移动端的帧率很吃Draw Call把两者结合看优化方向基本就清晰了。4.3 开启Stat中的Net相关内容热词里反复出现“UE5网络同步”这提醒我一点网络项目做性能优化时不能只盯渲染。项目设置里Netcode相关参数同样会拖累帧率比如服务器帧率过低会导致物理和寻路抽风客户端的网络更新频率过高也会让Game线程吃紧。控制台可以输入stat net观察带宽和RPC数量。但回到项目设置的层面更基础的是在Project Settings → Network里确认服务器帧率合理。不要为了“高响应”把服务器Tick开到120移动端游戏长时间运行时服务器性能会演变成玩家体感的卡顿虽然它和渲染完全无关。4.4 对照实测结果微调项目设置我的习惯是优化完一轮后把项目设置的几项关键选项和优化前数值列成一张表比如项目设置项改动前耗时改动后耗时观感影响ShadowMap Method5.2 ms3.1 ms几乎看不出SSR开启→关闭3.8 ms2.0 ms地面反射变暗TAA→FXAA2.1 ms1.3 ms边缘有轻微锯齿Lumen→烘焙GI8.5 ms2.4 ms动态光影丢失这样你就能知道哪些是白赚的哪些是用观感换性能后期做取舍时心里有底。5. 实践中的几个巨坑与一套自查清单5.1 刚开Lumen就卡别急着怪显卡很多人在项目设置里把Global Illumination设为Lumen然后发现卡到怀疑人生。问题的根源往往不是显卡太差而是项目里光源太多、反射面太杂。Lumen对场景的几何复杂度和光源数量都很敏感。我的实际建议是先在一个极简场景里验证Lumen确认它能跑再慢慢加物体。如果极简场景都卡那才说明是显卡扛不住。5.2 改动项目设置后一定要重新构建光照有一类“优化失败”案例完全是自己作的改了光照设置但没重新Build Lighting进游戏发现暗了或亮得奇怪于是又改回去误以为方案无效。烘焙光照贴图依赖构建数据你切换了光照模式、修改了光源半径还是需要重新构建的。不重建再好的设置也体现不出来。5.3 自查清单目标帧率和帧预算是否明确。目标平台是否在开局时就设定好。渲染模式是否匹配平台Forward / Deferred。Lumen / Nanite / Virtual Shadow Map是否按需开启。抗锯齿、反射、AO、Bloom是否有明确等级。剔除距离体积是否覆盖关键场景。静态网格LOD是否至少三档。纹理流送池大小和贴图尺寸是否控制到位。是否用stat unit确认过瓶颈。项目设置这种东西改起来不难难的是知道为什么改、值不值得改。我整理这份笔记的时候最大的收获其实是建立了“预算—测量—调整”的闭环。很多项目优化到一半停滞不是技术不够而是压根没有测量意识全凭感觉。建议你现在就打开你的UE5工程按上面的步骤过一遍项目设置再用stat unit看一眼数据大概率能发现几个被白白浪费的毫秒。后续我会继续整理UE5性能优化的第二部分重点讲场景搭建和资产层面的优化实战届时再回来填坑。