Epic官方:
你们好!
我们游戏开发已经有一定规模了。最近我使用insight对游戏性能做了一些分析。目前发现的、有显著性能问题的条目,都是Insight数据带有资产名称的条目。但是还有很多Tick无法分辨来自于什么。
我尝试给我们自己写的代码的Tick加Trace。但我们已经具有一定规模,因此加起来需要一些工作量。
此外,这样只能做粗略的问题定位,并且统计到Tick。而对于在c++中实现的函数,并不能统计到,还要根据现象、分析之后,有针对性的加追踪的代码。
既然UE已经有了反射、各个类也都有了名称。我想问问是否有更快捷的方法,可以以较小的修改,捕获到项目中的c++类?
比如:打开个什么设置、或者在自定义类上添加一个meta、或者宏,就可以让一个我们添加的c++类被insight统计。
- tick会被统计,会显示类名
- 类中自定义的函数调用会被统计,显示类名或函数名。
[Attachment Removed]
tuo.chen
(tuo.chen)
2
您好,先说结论,我认为没有这样的方法去处理。不知道您在获取trace数据的时候有没有添加 -statnamedevents 加了这个应该就能自动截取大部分的引擎pipeline中的函数及对应的对象名
UE的trace信息主要是通过SCOPE宏对应的scope变量的构造和析构函数中捕获的,而scope变量一般在需要在函数入口或者外层调度的地方调用,UE的反射并不会直接修改函数实现
如果想最小改动,一般需要在【调度的地方】加入scope变量,例如引擎其实在Tick、ProcessEvent这些固定运行管线的地方都已经加入了scope变量
例如在c++中调用某个UFunction的时候,不是直接调用Object->Func,而是使用ProcessEvent(GetUFunction(), params),这样这些函数trace都会被记录下来
[Attachment Removed]
可以利用AST分析C++代码,然后去处理,下面是一份示例代码处理关注的函数signature,如果匹配则添加trace标记 —— Add trace marks to some ticking functions for Unreal C++ 。 配置config.json大致如下:
{
"target_dirs": [
"D:\\UnrealEngine\\Projects\\xxx\\xxx"
],
"ignore_dirs": [
],
"enable_patching": true,
"dry_run": true,
"use_perforce": true
}
[Attachment Removed]