UE4中性能优化和检测工具合集
- 简述
- CPU
- Unreal Insight
- Unreal Profiler
- Simpleperf
- Android Studio
- Perfetto
- XCode Timeprofiler
- Best Practice
- GPU
- Adreno GPU
- Mali GPU
- Android GPU Inspector (AGI)
- 内存
- 堆内存分析
- Android Studio
- LoliProfiler
- UE5 Memory Insights
- Unity Mono 内存
- Memreport
- RHI Memory
- XCode Allocations
- 功耗
- 硬件方案
- 电流计
- 软件方案
- Perfdog
- Android 的 Snapdragon Profiler
- Ios 的 Instruments
- 包体
- SizeMap
- Unreal PakViewer
- Custom Built Profiler With CI
- 代码崩溃 & 稳定性
- Address Santizer
- StompAllocator
- Vulkan
简述
总结UE4中性能优化工具合集,之前转过一篇LLM内存统计工具,非常详细,这里会总结全面,包括了CPU/GPU/内存/功耗/包体/代码稳定的各类工具,方便筛选使用
对于每一帧来说,执行顺序依次为:Game Thread → Draw Thread → GPU Thread
Game Thread 首先会对整个游戏世界进行逻辑层面的计算与模拟(e.g.Spawn 多少个新的 actor、每个 actor 在这一帧位于何处、角色移动、动画状态等等),所有这些信息会被输送到 Draw Thread;
Draw Thread(也叫 Rendering Thread) 会根据这些信息,剔除(Culling)掉不需要显示的部分(e.g. 处于屏幕外的物体),接着创建一个列表,其中包含了渲染每个物体必备的关键信息(e.g. 如何被着色、映射哪些纹理等等),再将这个列表输送给 GPU Thread;
GPU Thread 在获取了这个列表之后,会计算出每个像素最终需要如何被渲染在屏幕上,形成这一帧的画面。
CPU
Game Thread 造成的开销,可以使用stat game显示 Tick 的耗时情况 ;dumpticks:可将所有正在 tick 的 actor 打印到 log 中
Unreal Insight
Unreal Insight在 Unreal Engine 4.24.3版本中开始支持移动平台性能数据录取。数据直接写入文件,GUI工具采集结束后离线解析数据文件。(平时使用较多)
优势:可长时间录制数据,数据在时间轴上以进程调度的形式展示,比较容易分析Game、RenderThread与WorkerThread的调度情况,从整体上结合时间连贯性对CPU瓶颈进行初步的定位。也可用于分析有规律的卡顿掉帧的情况。
劣势:所记录的调用堆栈较浅(可手动打点),较难定位到具体出问题的代码,人工分析需要时间与经验
Unreal Profiler
UE5已删除此模块
(平时使用较多)Unreal Engine 中的 Profiler则是分析CPU端性能情况的一个老工具,与Unreal Insights相比它缺少了线程间调度情况的数据,优点在于其记录的调用堆栈深度较深,可与Insights结合使用 UE4引擎窗口中菜单DeveloperTools下SessionFrontend界面即为Profiler所在的窗口 可通过两种方法抓取数据:
启动程序时增加参数:-messaging
游戏中使用命令: stat startfile, stat stopfile
/sdcard/UE4Game/YourProject/UE4CommandLine.txt
../../../YourProject/YourProject.uproject -messaging
# 数据存放于
/sdcard/UE4Game/FPSDemo/FPSDemo/Saved/Profiling/UnrealStats
Simpleperf
Simpleperf可录制很深的CPU调用堆栈,可用于详细分析问题时间内的CPU代码执行情况,其将数据聚合,输出类似于Instrument TimeProfiler的形式,可以看到不同函数在一段时间内的贡献、占比情况,及调用次数,方便对其进行更有针对性的优化。但这种聚合模式没有单帧的概念,主要用于宏观统计。因此可以与Profiler、Insights等工具结合使用。建议使用Test包进行数据分析,避免Development版本额外代码所造成的性能压力影响真实数据
Android Studio
使用Android Studio的 ProfileAPK 功能,即可较为自动的生成性能数据
Perfetto
Perfetto可以拿到simpleperf、systrace等数据
可用于分析APP、系统整体CPU调度,渲染节奏等问题
XCode Timeprofiler
XCode Timeprofiler 与Simpleperf原理相同的CPU性能分析工具,功能强大
Best Practice
粗粒度工具:FramePro、UnrealInsight 用于开发期CI暴漏明显问题
发现问题后,使用细粒度工具进行深度分析:Simpleperf、Streamline、TimeProfiler
建议使用Test包,排除Cache、冗余代码、Profiler本身对性能的影响
尝试:离线计算、ParallelFor、异步化、SOA化等方案
并使用CacheSim、Streamline进行 Cache Miss 分析,压榨出最后的水分
GPU
如果是在PC平台上可以使用ProfileGPU命令或者使用快捷键Ctrl+Shift+,影响GPU瓶颈最主要的是BasePass和PrePass
现代Mobile GPU通常使用 TBR、TBDR 硬件架构
在有限的功耗下提供尽可能多的性能空间
除了控制 运算负载、动态分支、全精度运算 等天然GPU不友好的指标之外
Mobile GPU因其On-chip Memory较小的原因
需要严格控制寄存器数量,避免Register Spill产生额外IO带宽
Adreno GPU
Adreno GPU
使用Snapdragon Profiler进行Counter数据抓取 提供python脚本进行Counter数据汇总与分类
Mali GPU
Android GPU Inspector (AGI)
Android GPU Inspector (AGI)
系统性能分析
执行系统级跟踪和分析,以深入了解游戏和系统服务使用的资源,例如 GPU、CPU、内存、电池和 GPU 计数器。支持 Qualcomm® AdrenoTM、Arm® MaliTM 和 Imagination® PowerVRTM GPU
帧性能分析
从单个应用帧捕获跟踪记录,然后对游戏的 GPU 使用情况执行深入分析。其中包括对 Vulkan 和 OpenGL ES API 调用进行更深入的介绍和分析
内存
Android、iOS内存管理核心:
- 分页(Paging)
- 内存映射(Memory Mapping)
CPU & GPU 公用一套内存硬件(GPU有少量OnChip Memory)
当内存不足时触发分页(Page Out)释放内存:触发 内存压缩; 删除Clean Page; 当剩余内存低于阈值,系统将开始杀进程
堆内存分析
Android Studio
Android Studio 支持 Native(C++) 堆内存分配的分析工作
Perfetto组件可使用Heapperfd进行Native内存分析工作
LoliProfiler
LoliProfiler支持整合至 UE、Unity 引擎分析 Native(C++)内存
UE5 Memory Insights
UE5 Memory Insights
Unity Mono 内存
Mono虚拟机(IL2CPP)提供内存快照接口
UnityMemPerf用C++&QT完美还原了Unity IL2CPP内存工具PerfAssist的体验,无需Unity、无需SDK,连接USB拉起APP即可抓取托管内存快照,进行内存分析、快照Diff
Memreport
提供 UE4 Memreport 数据解析、Diff与可视化功能:(经常使用)
RHI Memory
可针对性的对 UE Vulkan、GL、Metal RHI层内存申请接口结合 FRHIResource 的DebugName
实现一套数据Dump机制,以链接 RHI 内存与 UE RHI资源,深入分析RHI内存
XCode Allocations
类似 Simpleperf 在 iOS 可查看堆内存分配数据的工具
iOS Memory Deep Dive
功耗
手机硬件集成度高,重度手游发热明显,发热与功耗的关系越来越受到开发者的重视
功耗统计难点:
- 硬件集成度高,被动散热上限低
- 难以测量单模块功耗
- 静态、动态功耗叠加
- 能耗和利用率、频率呈线性关系,和电压呈二次关系
综合导致:功耗数据获取难度大,功耗数据体现非线性,数据分析难度也很大
优化建议:均衡CPU利用率;多线程使用;空间换时间;注意屏幕耗电;实时查询响应能耗发热;与硬件厂商合作
硬件方案
电流计
设备充满电(100%),将电流计与充电头连接。
在系统的蓝牙管理面板中查找设备,配对连接并且获取其Mac地址记下。
软件方案
Perfdog
支持基于驱动上报的功耗数据获取, iOS直接解析了XCode Energy的数据
Android 的 Snapdragon Profiler
Snapdragon Profiler
使用实时指标识别潜在问题区域,从 150 多个硬件性能计数器中进行选择
分析跨 CPU、GPU 和 DSP* 的系统、图形和 ML 工作负载
使用 Snapshot 捕获捕获和调试图形工作负载,从而实现更深入的帧和着色器分析
对任何 DirectX、Vulkan、OpenCL 和 OpenGL ES 工作负载进行详细分析
Ios 的 Instruments
Instruments 是 Xcode 的一个工具集,为我们提供了强大的程序性能分析及测试能力。可以进行CPU 性能测试、图形性能测试、内存性能测试等
包体
包体的大小、首包资源的大小对于玩家有较大影响
尽可能减少包体大小,也是开发者需要关注的重点问题
SizeMap
SizeMap介绍,可以将本地的pak包加载, SizeMap以TreeMap图的形式将资源分类,我们可以点击任意分类进入更深的层级来分析数据
Unreal PakViewer
Unreal PakViewer
Custom Built Profiler With CI
Asset Registry 中包含资源的 Meta 信息(AssetRegistrySearchable),可在Cook & Package 结束后使用 Commandlet 分析此信息
代码崩溃 & 稳定性
可通过addr2line翻译崩溃符号至具体代码行号
# android-ndk-r21d\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line.exe
addr2line.exe -f -C -e path/to/libUE4.so 0x009988ff
Address Santizer
Android、iOS平台原生支持 ASan,UE也已整合至引擎中
测试ASan包,提前发现内存越界、Use-after-free等常见内存问题
安卓使用ASan检查UE4内存问题
StompAllocator
Windows平台也支持ASan,不行的是至少4.27版本的引擎仍旧无法正常使用ASan功能
可使用替代品,UE内部的 Stomp Allocator(会占用巨量虚拟内存(60G+))
https://pzurita.wordpress.com/2015/06/29/memory-stomp-allocator-for-unreal-engine-4/
通过Page可以设置Read、Write保护的特性,在每次申请内存时,使用Page读写保护来保护内存区域
当越界读写时,就会触发保护,从而崩溃在问题出现的第一现场
Vulkan
Vulkan RHI在较新的移动设备中已全面支持
其RHI性能、驱动内存占用,可玩性、以及可优化性 远超 OpenGL RHI
包含Command的Trace工具,发现崩溃问题时,可通过Trace工具记录完整Command数据