【UE·优化篇】使用FramePro优化UI性能
FramePro在公司项目组里用挺久了,搜了下网上资料几乎没有,所以这次心血来潮写一下。
FramePro介绍
FramePro是一个第三方性能分析工具,可用于C++开发的任何项目里,UE也不例外。

对比UE自带的Insight有以下优缺点:
共同点:
- 帧率,每帧耗时,峰值曲线,函数调用性能等都有
- 支持分析编辑器下运行游戏,以及打包在PC和手机端的版本
- 支持录制数据,回放分析
优点:
- 支持实时连接看性能数据,对比UE的需要先录制数据再分析更方便
- 可以看到每个CPU核心的消耗情况
- 完全独立UE的第三方软件,使用简单,不需要开UE,对于策划、测试等非程序岗位的人很友好
- 支持长时间一边跑一边分析,且保存后的数据文件比UE小很多(只有UE的1/3左右)
缺点:
- 贵,正版要2000块人民币。(
但是国内有绿色版你们懂的,我会放评论区) - 显示的函数内容比UE的少一点,需要自己手动stat埋点增加
- 只有CPU耗时相关数据,其他像内存、GC、GPU方面不如UE的全面
对比UE4的Profile:
- Profile虽然也有实时连接,但是UE5里已经删了Profile的功能。另外FramePro的函数占用性能也比Profile更直观。
简单来说,FramePro是一个CPU耗时专精的性能分析软件,比UE自带的分析工具更轻量。在不知道性能哪里有瓶颈的情况下,适合一边开FramePro一边跑游戏,能看到清晰的帧率变化情况,比UE直接开show fps更直观。在确定哪个地方容易发生卡顿以后,再开UE的Insight录制数据逐帧分析瓶颈。
FramePro使用
使用FramePro需要把FramePro安装以后的FramePro.h和FramePro.cpp文件放到工程里面。UE源码已经自带这两个代码。

我们需要把FramePro.h里的FRAMEPRO_ENABLED的宏设为1。

运行游戏,输入命令行:
- Stat NamedEventes(不敲这一步会有很多函数显示不了)
- framepro.enable 1

点击Framepro界面左上角的Connect,就会自动连接正在运行中的游戏。
点击保存可以把记录的数据保存成文件读取:

FramePro实战
接下来以我最近优化的一个UI性能点为实例(部分信息敏感会打码 ),讲一下怎么使用FramePro来优化性能。
随便点开一帧的数据,能看到总耗时20ms。其中Slate里面的Tick占了8ms多。这个测的是玩家在大地图里原地站着什么都没有做的情况,这个cpu耗时是有点高的。


展开来看,其中有一个叫Layout的界面占了1ms的耗时。
其中有相当一部分是TickWidget的消耗:

有看到LuaFunction的消耗:

推测在Lua里面写了大量Tick的逻辑,因为slua是可以直接实现C++的BlueprintImplementableEvent的UFunction的。

为了验证这个Tick影响大不大,修改源码,写了一个命令去控制这个Tick是否调用:


关了以后再看Slate::Tick有6.多ms左右:

说明Lua里面实现这个Tick至少有1.多ms的优化空间。
搜了一下确实非常多:

知道瓶颈在哪以后,剩下怎么优化就很简单了。这里举几个典型案例:
- 减少频繁C++调用:
- 比如这里调用Pawn的C++方法
- 还有在tick里创建Vector


- 用计时器Timer代替Tick
- 其实很多逻辑都不用每帧Tick,只是一时图方便写Tick。完全可以用计时器替代。

- 其实很多逻辑都不用每帧Tick,只是一时图方便写Tick。完全可以用计时器替代。
- 写C++的Tick里代替Lua里的Tick
- 如果一定要写Tick。比如说小地图里的玩家位置,如果不是每帧更新的话那会很奇怪。这种没办法的情况只能写C++里了
最后改完再测下性能:
耗时降到了7ms,大概省了1ms多的耗时。

当然UI这块还有很多可以优化的地方,但是这就不是本文的重点了,本文重点讲下FramePro以及结合一个简单实战案例教会大家使用。
总的来说Framepro还是挺不错的,弥补了UE5不能用Profile实时连接的缺憾。而且使用方便分析直观也不咋影响电脑的性能,可以看到一直开着的情况下,内存占用100mb,比一众软件都低得多。

链接: https://pan.baidu.com/s/1-wk_nsP2IkivcIE5xjoUCg 提取码: yj3u
