UE4 /UE5 PC/安卓优化

本文提供UE4/UE5场景优化教程,涵盖模型、灯光、材质、植被、碰撞、阴影、UI及程序方面,通过减少资源消耗提升场景流畅度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B站教学链接:https://space.bilibili.com/449549424?spm_id_from=333.1007.0.0


一、概述

       UE4/UE5场景中的资源越多,消耗的内存就越大,就会越卡顿。这里教大家如何进行场景优化,来减少内存,使得场景更加流畅。

二、模型优化

   2.1、使用3Dmax或者Maya制作的模型,面数最好不要太多,虽然UE4/UE5能支持百万级的面数,但是能减少的面数尽量减少,不需要的部分能删除就删除。

  2.2、材质ID,在Max或者Maya里面,一个模型材质过多的话会分配材质ID,但是在UE4里面如果材质过多,会加大渲染消耗资源。所以在UE里面如果模型简单的话尽量用一个材质解决。

  2.3、这个跟程序设计师有关,模型的坐标一定要在模型中心点的位置,这样后面做交互会更加方便一点。

  2.4、光照贴图和阴影贴图:在往UE4里面导入物体的时候我们一定要记住我们这个物体要有2UV,顾名思义就是两套UV 第一套UV我们是存放光照贴图的,第二套就是存放我们的阴影贴图的。这个在UE里面了则是UV0和UV1表示,默认的就是UV就是1,以及我们光影贴图的分辨率大小也是2的次幂。 

三、灯光优化

  3.1、Lightmass Importance Volume:大场景,不添加则全局构建光照贴图产生全局Indirect Lighting Cache;添加则在指定区域构建光照贴图Indirect Lighting Cache;

 3.2、点光源和聚光灯尽量不要开启Cast Volumetric Shadow;默认只有平行光开启了此选项。开启后的性能消耗为不开启的性能消耗三倍。不开启表示阴影计算方式使用Shadow Mapping,开启表示使用Shadow Volume,前者的阴影计算没有后者精准,但是计算量小;

 3.3、大气雾如果开启体积雾,建议将灯光改成静态光,这样在Build Lighting时会生成预计算的体积雾相关数据,这样可以显著提升体积雾性能。体积雾性能消耗巨大。

 3.4、静态光不用时禁用Static Lighting 

3.5、关闭Support Global clip plane for Planar Reflections,默认关闭,开启后消耗巨大。

 3.7、Ambient Occlusion开启之后,如果是动态光的情况下会消耗资源,开启AO后(Project Settings -> Rendering -> Default Settings ->Ambient Occlusion),引擎默认的AO为SSAO(Screen Space Ambient Occlusion), SSAO无法进行预计算,所以GPU性能开销较大,可以修改为DFAO(Distance Field Ambient Occlusion)以提升性能,因为DFAO可以预计算,代价是增加显存开销;

 四、材质优化

  4.1、材质的复杂度不宜过高,尽量少使用半透明材质,会很消耗资源,材质类型的性能,从快到慢:Opaque -> Masked -> Translucent。

  4.2、材质使用时要提前规划好,相同材质的物体公用一个材质,尽量避免从网上下载的多个材质,每个都用一遍,提高复杂度。

五、植被优化

  5.1、在场景中有大量的植被时,可以使用HierarchicalInstancedStaticMesh进行优化,这样可以减少CPU的开销,因为使用HierarchicalInstancedStaticMesh,可以减少draw call次数,要想场景做到更好的优化,最好的办法是需要减少材质种类,提高材质复用率

  5.2、 为Instanced Mesh设置合适的Cull Distance。

六、碰撞优化

 6.1、在模型制作的所有的模型不需要碰撞,如果是加了碰撞,在引擎里移除碰撞。

 6.2、BoxComponent的 Generate Overlap Events 设置为false。如果不需要Overlap事件,那么就将该属性设置设置为false,默认为true。当BoxCompont达到一定量级时,开启Generate Overlap Events的性能消耗是关闭情况下的两倍。

 6.3、 不需要物理,将 Simulate Physics 设置为false。

 6.4、 不需要Hit事件,将 Simulation Generates Hit Events 设置为false。

 6.5、如果场景中物体类型(WorldStatic、WorldDynamic、Pawn等)很多,且每种数量也很多,则Collision 的 Object Response 通道设置的越少越好,把可以设置为 Ignore 的通道都设置为 Ignore 。如果场景中的物体类型比较单一,即使这种类型的物体在场景中有数百个,Object Response 即使都设置为Block 或者 Overlap,对性能也没有影响。

七、阴影优化

  7.1、Directional Light:Dynamic Shadow Distance(默认为0,表示关闭)。提升性能的原因:Dynamic Shadow Distance 表示在多少距离内使用动态阴影,超过这个距离之外Fade成静态阴影,而Fade成静态阴影后就可以提升性能。

八、UI优化

  8.1、游戏线程优化

    1.GridPanel会遍历所有的ChildWidgets,r然后计算Draw Elements,最后Grid Panel返回一个或者多个Draw Elements进行渲染,如果是是一个复杂的控键数,这个开销也是比较大的。解决的办法是使用Invalidation Box缓存Draw Elements (Vertex Buffer),用Invalidation Box封装GridPanel。

 

这个有一点需要注意的是一个Volatile的概念,如果标志成Volatile的Widget每帧都会重新计算,一些属性的Widget Binding会使得Widget变成Volatile,Check Box放在Invalidation Box下会不起作用,需要设置成Volatile,建议自定义User Widget,用Button实现对应功能。

可见性:HitTestInvisible 可见、当前控件不可点击、所有子控件不可点击,SelfHitTestInvisible 可见、当前控件不可点击、不影响子控件,Hidden 不可见、占用布局空间,Collapsed 不可见、不占用布局空间。

 果大量的Visible会导致点击响应太慢,这个也会消耗很大的性能,Button设置成Visible,其它Widgets可以设置成Self Hit Test Invisible或Hit Test Invisible,Collapsed不占用布局空间, 略优于Hidden,Show/Collapse要优于AddToViewport/RemoveFromViewport。

这里还要讲一个是Widget Binding,某些属性上Widget Binding会导致对应Widget被放入Volatile List,这些属性发生变化,表示对应的控件需要重新计算Vertex Buffer,所以我们尽量避免这个Widget Binding。另外还有一点是Widget Binding会每帧Tick执行,这一点也会带来比较大的性能开销,所以手机上面建议使用C++ Event设置Widget属性。

 8.2、渲染线程优化

渲染线程优化,渲染线程首先介绍一个合并批次,我们在左图看到的是UI的有些可以合并批次,有些不可以合并批次,像不合并批次Canvas Panel、合并批次Grid Panel、Uniform Grid Panel、Vertical Box、Horizontal Box。

 Retainer Box,将UI渲染到Render Target,再将Render Target 渲染到屏幕,另外引擎处理了点击响应区域的映射,鼠标点击区域引擎已经自动在屏幕上面映射了相应的测试。

Widget Render:将UI渲染到Render Target,Slate Render: 使用缓存的Render Target渲染Back Buffer,每隔3帧一个循环进行Retainer Box的更新,将1帧的UI渲染工作量分配到3帧去处理。

九、程序优化

       蓝图的话其实在大多数情况下性能都是没有问题的,但是如果我们要在低端机上面需要追求很好性能的话,其中有计算量比较大的逻辑,我们是不建议放在蓝图里面做,因为毕竟中间有很多的分装,建议可以把一些计算量比较复杂的逻辑下放在C++里面做,运行效率比蓝图高,更灵活,很多C++接口并未开放成蓝图接口,除了UI动画,其它代码都能用C++实现。

对于UI开发,我们建议开发者有Widget Manager,可以在蓝图中,也可以在C++中,就是管理所有User Widget,Brush、Font等资源也可以在Widget Manager中统一管理,这样的项目比较好管理,特别是UI比较多的时候。

对于3DRTT,这个小技巧并不需要每帧Tick,只要和动画频率大致同步就可以,所以我们要把每帧去渲染的两个选项关闭,同时这个蓝图我们设置成0.03秒Tick一次,产生在蓝图当中Tick这样的RTT,另外还有一个小细节就是Render Target的尺寸不要太大,会影响显存和渲染效率。

<think>好的,用户的问题是关于在Unreal Engine中打包安卓应用后运行特效时出现卡顿的优化解决方案。首先,我需要回忆UE在移动平台上的优化策略,尤其是针对安卓设备的。 首先,特效卡顿可能涉及多个方面,比如GPU性能、粒子系统复杂度、材质复杂度、Draw Call过多等。安卓设备的硬件差异较大,尤其是中低端设备,可能GPU和内存资源有限,需要特别优化。 接下来,根据用户提供的引用,特别是引用[1]提到的优化场景的方法,比如网格合并、材质优化、几何体简化,这些可能也适用于特效优化。特效通常涉及大量的粒子系统和复杂材质,所以需要检查这些部分。 然后,考虑用户提到的引用[2],里面提到了性能分析工具的使用。在UE中,可以使用内置的Profiler工具来分析性能瓶颈,确定是CPU还是GPU的问题。如果是GPU瓶颈,可能需要减少粒子数量、简化材质或降低分辨率。 另外,安卓平台的打包设置也很重要,比如是否启用了适当的纹理压缩格式,是否关闭了不必要的插件,以及项目设置中的移动端优化选项是否正确配置。 可能还需要考虑内存管理,过多的纹理或过高的分辨率会导致内存压力,从而引起卡顿。使用Mipmaps和适当的LOD设置可以缓解这个问题。 最后,需要综合这些因素,给出具体的步骤建议,比如分析性能数据,优化粒子系统,调整材质,降低渲染负载,以及项目设置的调整。同时,建议用户逐步测试每次优化后的效果,以确定最有效的解决方案。</think>以下是针对Unreal Engine在安卓平台打包后运行特效卡顿的优化方案,按优先级分步实施: **1. 性能分析定位瓶颈** - 使用UE内置的`Stat Unit`和`ProfileGPU`命令查看CPU/GPU耗时,确定卡顿根源 - 通过`Android GPU Profiler`分析特效渲染阶段的瓶颈(如Overdraw率、Shader复杂度)[^1] - 用`Particle Edit Mode`检查特效系统的Spawn Rate和Particle Counts **2. 特效系统优化** ```cpp // 蓝图示例:动态调整粒子数量 Set Float Parameter (Particle Spawn Rate) ← Lerp(MinSpawnRate, MaxSpawnRate, DevicePerformanceFactor) ``` - 通过$N = N_{base} \times \frac{1}{\sqrt{\text{DeviceTier}}}$公式动态控制粒子数量 - 启用LOD系统:根据设备性能自动切换特效版本 - 限制同时播放的特效实例数(使用对象池技术) **3. 材质渲染优化** $$ \text{Shader复杂度} = \sum(\text{Texture Samples}) + 2\times(\text{Math Operations}) $$ - 控制材质指令数在`<100`(移动端标准) - 合并使用相同Shader的特效材质球 - 将RGBA通道打包到两张$512\times512$纹理(BC6H压缩格式) **4. 工程设置调整** ```ini [/Script/AndroidRuntimeSettings.AndroidRuntimeSettings] bDisableVulkanSupport=False bEnableDynamicResolution=True TextureFormat=ETC2 ``` - 开启`Mobile Multi-View`减少50%的Base Pass渲染 - 使用`ES3.1 + Vulkan`后端提升驱动效率 - 设置`Mobile Scalability`为Medium预设 **5. 内存优化** - 对特效贴图启用Mipmap Streaming - 通过$M_{pool} = \frac{\text{VRAM}}{4}$公式计算粒子池大小 - 使用`ADB内存监控`确保特效资源加载不超过300MB阈值 **验证方案** 1. 使用`Android Frame Profiler`对比优化前后帧时间分布 2. 在$T_{low}$(骁龙660)和$T_{high}$(骁龙8 Gen2)设备进行压力测试 3. 检查`DrawCall`是否降至<200(复杂场景特效区域) >[!NOTE] > 对低端设备可添加`r.MobileContentScaleFactor 0.75`降低渲染分辨率
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞起的猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值