UE性能优化实践

内存(空间)/ 帧率(时间)

内存

IOS的内存要比Android小很多。例如,21年发布的IPhone13内存是4-6G,小米12内存是8-12G,相差一倍。近年的高端机则不再有这么大的差别,25年发布的IPhone17内存是8-12G,小米17内存是12-16G。

相比Android,IOS能够使用更小的内存实现系统的流畅运行,一方面是因为编程语言上的区别。IOS使用Objective-C、Swift,会被直接编译成在CPU上运行的原生代码,无需任何解释器和虚拟环境;Android使用Java、Kotlin,依赖JVM进行解释执行(Kotlin/Native支持将 Kotlin代码编译为无需虚拟机就可运行的原生代码,这个差距正在缩小),而使用JVM会增加app使用的内存。例如YouTube,在IOS/Andorid上的内存使用分别为176/282MB,差距明显。

对于游戏而言,比如Unity和UE,在IOS/Andorid上都是通过编译为原生代码运行,因此内存使用相差不大。例如原神,在IOS/Andorid上的内存使用分别为1270/1400MB。差距可能是因为纹理压缩方式、着色器编程语言的差异。

Apple vs Android RAM management: Who does it better?

IPhone手机不仅内存更小,IOS的内存管理策略也更加严苛,系统在内存紧张时会通过Jetsam直接终止占用过多内存的前台进程。对于IOS,app的内存占用应在50%以下,才能避免闪退的风险。因此,游戏内存优化的需求主要来自于旧款IPhone手机。

iphone - ios app maximum memory budget - Stack Overflow

对iOS Jetsam内存管理机制的一些探索 - 知乎

首先,要避免内存泄漏,这是最基本的要求。减少内存使用大致有压缩、复用(对象池)、牺牲表现、及时释放四类方法。通过UE自带的InsightsmemreportLLM,外部工具VMmapkeymob等,可以检查内存使用情况、发现可以优化的瓶颈。

UE 手游在 iOS 平台运行时内存占用太高?试试这样着手优化 - indienova 独立游戏

GC

UE的gc.TimeBetweenPurgingPendingKillObjects默认是61.1秒,针对不同平台设置不同的内存阈值,当FPlatformMemory::GetStats().AvailablePhysical小于阈值时,调用ForceGarbageCollection进行强制GC。

物理

对于静态网格体,不需要碰撞时 Collision Presets 选择 No Collision ,有碰撞时优先使用简单碰撞, Collision Complexity 优先选择 Use Simple Collision As Complex 。简单碰撞优先使用简单几何碰撞体,然后再考虑凸包。若要使用复杂碰撞,可以设置 LOD For Collison For IOSLOD For Collison For Android 在移动端使用更简化的网格作为复杂碰撞。如果CPU端不需要几何数据,关闭 Allow CPUAccess

对于骨骼网格体,如果CPU端不需要LOD数据,关闭Allow CPUAccess

FaceRemap即碰撞体经过Cook之后依然保留的面重映射表,以在场景查询中支持物理材质。若不需要,在项目设置中开启Suppress Face Remap Table;即使没有开启,只有勾上了Support Physical Material Masks的静态网格体才会生成FaceRemap。

如果项目不依赖于通过碰撞检测结果来找回UV坐标的功能(FindCollisionUV),可以在项目设置中关闭Support UV From Hit Results

帧率

通过UE自带的Insights,定位耗时高和引起帧率波动的函数进行优化。尽量减少不必要的Tick,将耗时逻辑分帧执行,通过并发和异步减少主线程压力。

GC

对于GC,设置gc.MaxObjectsNotConsideredByGCgc.SizeOfPermanentObjectPool为合适的值,从而降低GC消耗。若要设置精准的值,从游戏日志中找到如下内容,将第一个数设置为gc.MaxObjectsNotConsideredByGC,第二个数设置为gc.SizeOfPermanentObjectPool

1
2
[2015.03.04-10.00.21:716][  0]LogObj: 38723 objects as part of root set at end of initial load.
[2015.03.04-10.00.21:716][ 0]LogUObjectAllocator: 9779464 out of 0 bytes used by permanent object pool.

Game Hitches (GC Mark Time?) - Programming & Scripting / C++ - Epic Developer Community Forums

加载

对于副本中会用到的角色/AI资源,在副本加载时即进行预加载,在副本中战斗时便不会出现因为加载资源发生的卡顿。

对于不是频繁加载/创建且生命周期较长的特效(如关卡中的特效),避免在蓝图中直接使用特效节点,使用自定义的特效组件进行异步加载管理,以免引起同步阻塞。

物理

对于静态网格体的碰撞体,应尽量使用简单碰撞。简单碰撞中应优先使用简单几何碰撞体(球体USP_ > 胶囊体 UCP_ > 盒体 UBX_),然后再考虑使用凸包(UCX_)。

《3D古城场景角色碰撞优化的实战指南》 - 技术专栏 - Unity官方开发者社区

对于骨骼网格体对应的物理资产,针对不同平台制作不同级别的简化物理资产,同时保证在收到打击时(AddImpulse)的布娃娃表现一致。比如,若bVelChange为true,物理资产及其简化版应保证受击骨骼质量一致(动能一致)、总质量一致。

工具

Insights

通道gpu、bookmark、frame、cpu、log默认启用,其他通道可自行选择开启,追踪内存的话开启memory通道即可。

追踪编辑器独立进程游戏/游戏包体:

1
-trace=log,cpu,frame,bookmark,gpu,memory -statnamedevents -tracefile

编辑器cmd追踪:

1
2
Trace.Start log,cpu,frame,bookmark,gpu,memory -statnamedevents -tracefile
Trace.Stop

虚幻引擎Trace开发者指南 Epic Developer Community

虚幻引擎中的Memory Insights Epic Developer Community

LLM

在独立进程游戏中运行时添加额外启动参数-llm,使用stat llm系列命令即可查看当前内存占用信息。llm即Low Level Memory,会统计UE中所有能被追踪到的内存占用,不走FMemory申请的内存无法被追踪到,比如第三方库。

虚幻4IOS内存优化之追踪Untrack内存 - 知乎

memreport

命令行中运行memreport -full,会将当前帧的所有内存资源导出,如果开启了LLM则也一并导出LLM,位置在Game\Saved\Profiling\MemReports,后缀为.memreport,可以以文本格式打开。里面的信息包括物理/虚拟内存总计、UObject统计等。可以在BaseEngine.ini中添加[MemReportFullCommands]配置输出信息。

1
2
3
4
5
6
7
8
9
10
11
12
[MemReportFullCommands]
; Additional commands to run with memreport -full
+Cmd="DumpParticleMem"
+Cmd="ConfigMem"
+Cmd="r.DumpRenderTargetPoolMemory"
+Cmd="ListTextures"
+Cmd="ListParticleSystems -alphasort"
+Cmd="obj list class=SoundWave -alphasort"
+Cmd="obj list class=SkeletalMesh -alphasort"
+Cmd="obj list class=StaticMesh -alphasort"
+Cmd="obj list class=level -alphasort"
+Cmd="obj list class=StaticMeshComponent -alphasort"

VMmap

VMMap - Sysinternals Microsoft Learn

对于UE中无法追踪到的内存,可以借助这个工具进行追踪,比如代码段和静态数据段的内存占用。

UE5 内存盘点与分析 - zxddesk - 博客园

keymob

克魔(KeyMob)-iOS性能助手

下面是IPhone14Plus上不同开放世界手游的性能对比(默认设置,初始地图跑图,统计取平均值):

原神 Yuanshen 鸣潮 Client 无限暖暖 X6Game 二重螺旋 EM
FPS 33 34 33 30
内存 GB 1.76 1.77 2.12 2.24
CPU利用率 % 95.12 50.82 78.76 86.74
GPU利用率 % 33 53 70 71

CPU利用率=各核心使用率之和,IPhone14Plus的CPU为6核,单进程最大理论占用率为600%。

GPU利用率:所统计的设备利用率、渲染器利用率、Tile利用率基本一致,用GPU利用率概括。


UE性能优化实践
https://tech.reddish.fun/Article/UE-Optimization/
作者
bit704
发布于
2025年9月29日
许可协议