Unreal Engine Level optimization
浅析记录一下引擎关卡优化的一些技术
剔除(Culling)




剔除: 减少关卡中减少任意给定时刻的可见对象数量,减少draw calls、depth testing、overdraw等开销的技术,从而达到优化性能的目的。
1. 视锥体剔除(Frustum Culling)—— “镜头外的东西,不画!”
原理:只渲染摄像机视锥体(类似金字塔形的可见范围)内的物体。
Unreal
虚幻引擎中视锥体剔除是默认开启的
在关卡视口中编辑时,选择 显示(Show)>高级(Advanced) 并启用 摄像机视锥(Camera Frustum),可以显示视图视锥。

Unity
视锥体剔除是Unity中最基础的剔除技术,它会自动跳过不在摄像机视野内的对象的渲染。
这一技术无需额外设置,默认开启的,适用于所有场景。


2. 遮挡剔除(Occlusion Culling)—— “躲在墙后的东西,不画!”
原理:用预计算或实时检测,跳过被其他物体完全挡住的物体。
Unreal
虚幻引擎中,遮挡剔除是默认开启的,我们可以查看和调试它。
剔除调试
r.VisualizeOccludedPrimitives 1 ## 启用时,将围绕着任何被遮挡Actor绘制一个绿色边界框。
FreezeRendering ## 根据摄像机视图,暂停/取消暂停关卡中被遮挡和可见Actor的当前渲染状态。
Foliage.Freeze ## 根据摄像机视图,暂停关卡中被遮挡和可见着色植被集群的当前渲染状态。
Foliage.Unfreeze ## 取消暂停关卡中被遮挡和可见着色植被集群的渲染状态。
FX.FreezeParticleSimulation ## 暂停/取消暂停关卡中任何CPU Sprite粒子模拟。
FX.FreezeGPUSimulation ## 暂停/取消暂停关卡中任何GPU Sprite粒子模拟。



Unity
遮挡剔除 Occlusion Culling
打开 Window > Rendering > Occlusion Culling。
将对象标记为静态。
烘焙遮挡数据。
bake 参数:
Smallest:可以被剔除的物体的最小尺寸,如果物体小于这个尺寸,即使被遮挡了也不会被剔除。
Smallect Hole: 如果物体堆叠起来形成一个孔,或是这个物体本来就带孔,通过这个孔我们可以看到后面的物体,这个参数的作用就是当孔的大小小于这个参数值时就会被忽略这个孔的存在,那孔后的物体就会被剔除。
Backface Threshold : 设置背景剔除的阈值。当值为100时就不剔除背景,当小于100时U3D对背景进行优化甚至去掉背景。


提示
遮挡剔除在运行时由CPU执行计算,适合用于室内场景或狭小空间。需要注意的是,遮挡剔除数据会占用内存,因此必须确保有足够的内存来加载这些数据。
此外还可以开启 GPU Occlusion Culling 来利用 GPU 进行遮挡剔除。这需要在项目设置中启用 GPU 遮挡剔除。
GPU遮挡剔除是Unity 6及以上版本的新功能,它利用GPU在运行时处理遮挡剔除。
启用方法如下:
在 Project Settings > Graphics 中,将 Batch Renderer Group Variance 设置为 Preserve All。
在URP或HDRP资产中启用GPU驻留绘制器。
GPU遮挡剔除无需烘焙,适合开放世界游戏和新一代硬件。
3. 背面剔除(Backface Culling)—— “看不到的背面,不画!”
原理:默认不渲染多边形背面(法线朝后的面)。
坑点:透明物体(如玻璃)需要关闭背面剔除,否则会穿帮!
Unreal
默认情况下,Unreal的着色器启用了背面剔除。开发者可以在材质设置中启用双面显示。
Unity
默认情况下,Unity的着色器启用了背面剔除,在对象的现有材质中可以设置 Cull Off 不剔除 、Back 剔除背面(内表面) 和 Front 剔除正面(外表面) 来控制是否渲染背面。
其实就是在shader中定义。
也就是在 PassTags后声名Cull模式 - Cull Off
Cull Back
Cull Front
Shader "xxx/xxx/xxx" {
Properties { ###
}
SubShader {
Tags { ###
}
Pass { ###
}
Cull Off ## 此处
4. 距离剔除(Distance Culling)—— “太远的东西,不画!”
原理:根据物体与摄像机的距离,直接剔除。
坑点:距离把握好点,适用于较远处的资产-建议与LOD的等级调整衔接,不然会很突兀的消失或者加载某个资产。
Unreal
unreal中可以使用 距离剔除体积 Cull Distance Volume ,根据Actor的大小和距离来剔除关卡中的Actor。
unity
// Unity中的相机层级剔除代码示例
private void Start()
{
float[] layersDistance = new float[32];
layersDistance[0] = 20;
layersDistance[1] = 50;
layersDistance[2] = Mathf.Infinity;
Camera.main.layerCullDistances = layersDistance;
}
提示
同理我们还可以自定义剔除一些 其他内容。
// Unity中自定义剔除-碰撞器组件
private void Update()
{
float distance = Vector3.Distance(transform.position, Camera.main.transform.position);
if (Vector3.Distance(Camera.main.transform.position, Cube.transform.position) > 10f)
{
Cube.SetActive(false);
// RUN OTHER FUNCTIONS
gameObject.GetComponent<BoxCollider>().enabled = false;
}
else
{
if (!Cube.activeSelf)
Cube.SetActive(true);
}
}
Unity - 阴影距离剔除(Shadow Distance Culling)
网络收集的-只针对Unity 大致效果就是对于整体的阴影做一个lod的效果,在不同层级呈现不同的阴影质量。
LOD-HLOD
2. 细节层次(LOD)
核心原理
根据物体与摄像机的距离动态切换模型精度,降低远处物体的渲染负担,提升性能。
技术实现
层级划分
推荐 3-4 级模型(高模→中模→低模)。三角形数量逐级减少 50%(例如:10k → 5k → 2.5k → 1k)。
切换策略
距离阈值:根据场景规模设定切换距离(如 0-50m 高模,50-100m 中模,100m+ 低模)。
屏幕空间覆盖:根据物体在屏幕上的像素占比触发切换(更精准,避免远处小物体过度简化)。
渐变过渡:通过 Alpha 混合或 Morph Target 平滑切换,避免视觉“跳跃”(Pop-in)。
制作流程
手动优化:艺术家逐级简化模型,保留关键特征(如建筑的结构线)。
自动生成:使用工具(如 Simplygon、Maya 的减面工具)批量生成,需人工校验接缝和UV。
优化关键
低模需保留轮廓和碰撞体积(避免物理系统穿帮)。
材质复杂度同步降低(如减少法线贴图或高光贴图层数)。
局限性
多物体场景中 Draw Call 仍可能较高(每个物体独立渲染)。
动态物体(如移动角色)需频繁更新 LOD 状态,增加计算开销。
3.HLOD(Hierarchical LOD,分层 LOD)
核心原理
将多个相邻物体合并为单一网格,大幅减少 Draw Call 和渲染状态切换。
技术实现
静态合并
建筑群:将远景中的多个建筑合并为单一网格,使用简化材质(如烘焙光照贴图)。
植被:合并一片树林为低面片+透明纹理,减少 GPU 实例化开销。
示例:UE5 中通过 HLOD 集群将 100 栋房屋合并为 1 个 Draw Call,性能提升 40%。
动态合并
运行时生成:根据摄像机位置动态合并物体(需预计算空间分割,如四叉树/八叉树)。
流式加载:结合场景分块(Chunk)动态加载 HLOD 网格,适用于开放世界。
材质优化
纹理图集(Atlas):将多个物体的贴图合并为一张大贴图,减少材质切换。
简化着色器:使用统一材质(如 Vertex Color 替代复杂材质参数)。
优势与挑战
✅ 性能提升:Draw Call 减少、GPU 负载降低(尤其适合移动端)。
✅ 遮挡剔除优化:合并后物体更易被整体遮挡(如山脉后的城市)。
❌ 合并成本:预处理时间较长,需平衡合并粒度与效果。
❌ 动态物体处理:合并后的网格难以支持独立动画(需分离处理)。
- 传统LOD:
- 根据距离切换模型精度(高模→中模→低模)
- 推荐3-4级,三角形数量逐级减少50%
- HLOD(分层LOD):
- 合并多个物体为单一网格(如远景建筑群)
- UE5案例:HLOD集群降低40% Draw Call
LOD 与 HLOD 结合应用
场景分层优化
近景:传统 LOD(保留高模细节)。
中景:HLOD 合并中精度模型。
远景:超低模 HLOD + Imposter(广告牌技术)
UE5 实践案例
Nanite + HLOD:Nanite 处理微观几何,HLOD 处理宏观集群。
虚拟纹理:配合 Virtual Texture 减少 HLOD 合并后的材质内存占用。
性能对比数据
场景规模 传统 LOD Draw Call HLOD Draw Call
1000 栋建筑 1000 20
5000 棵树木 5000 50
3. 动态加载技术
技术 | 特点 | 适用场景 |
---|---|---|
关卡流送 | 手动拆分子关卡,异步加载 | 中小型动态场景(如副本) |
世界分区 | UE5自动分块,64位坐标支持 | 超大规模开放世界(如《堡垒之夜》) |
Mipmap
1. Mipmap简介
Mipmap是一种用于纹理压缩的技术,它通过对纹理进行多级采样来实现细节层次的控制。


作用
- 可以使得远处的像素不发生闪烁;
- 减小带宽;
除了解决摩尔纹, Mipmap目前在UE中还有其他用处:
纹理流送(Texture Streaming) :为了缓解显存占用的压力,UE默认会分配一定大小的纹理流送池(使用r.Streaming.PoolSize配置),
根据纹理的重要性(相机距离和纹理组优先级)来流入纹理的某个 MipLevel ,
从而尽可能降低降低整体的显存占用,这里有一些关于纹理流送非常有价值的文章
UI适配(UI Adaptation) :由于游戏可能要面临不同分辨率的运行环境,当缩小UI贴图的时候,
由于 下采样 (Downsampling) 的纹素跨度过大,将会导致贴图出现锯齿边缘,对于动态调整位置的UI,
还会出现明显的闪烁,此时就可以给UI贴图生成Mipmap,因为引擎会根据 DDX(UV),DDY(UV)来确定使用UI贴图的哪一个 MipLevel 。
但最好的方式还是将贴图进行分类到不同的 纹理组(TextureLODGroup) ,对每个纹理组采用统一的配置,这样在做多平台的性能调优时,会方便很多。

4. Shader与渲染优化
- 实例化渲染:批量渲染重复物体(草、石块)
- 贴图压缩:BC7格式压缩 + Mipmap链
- 光照烘焙:静态光源预计算(减少实时开销)
- 后期处理取舍:关闭运动模糊/降低SSAO精度
二、进阶优化策略补充
1. 材质与纹理优化
- 纹理合并:将小贴图打包成图集(如UI元素)
- 虚拟纹理(VT):UE5 Nanite支持16K超清贴图流送
- 材质函数复用:通过Material Function共享光照计算逻辑
2. 物理与碰撞优化
- 碰撞体简化:用Box/Sphere代替复杂Mesh碰撞
- 物理代理层级:
// UE5中设置碰撞预设 CollisionPreset = "PhysicsActor_Simple"; 异步物理计算:分离物理线程与主线程
4. 内存管理技巧‘、
资源池技术:预加载常用资源(如子弹、特效)
按需加载:对低频资源使用Async Loading
内存分析工具:
Unity:Memory Profiler
UE5:LLM(Low Level Memory Tracker)
5. 平台专项优化
移动端:
限制纹理尺寸≤2048x2048
使用ASTC纹理压缩格式
主机端:
利用硬件Compute Shader(如PS5的Geometry Engine)
启用硬件级VRR(可变刷新率)
三、性能调试工具箱
UE5调试命令:
stat fps:显示帧率与线程负载
profilegpu:分析GPU耗时热点
Unity工具链:
Frame Debugger:逐帧分析渲染流程
Burst Compiler:加速C# Job性能
第三方神器:
RenderDoc:深度抓帧分析
Razer Cortex:实时监控显存/内存占用
文章参考引用
unreal:
unity:
更新日志
3f751
-于