是否有便捷的方法让新c++类被Insight追踪

Epic官方:

你们好!

我们游戏开发已经有一定规模了。最近我使用insight对游戏性能做了一些分析。目前发现的、有显著性能问题的条目,都是Insight数据带有资产名称的条目。但是还有很多Tick无法分辨来自于什么。

我尝试给我们自己写的代码的Tick加Trace。但我们已经具有一定规模,因此加起来需要一些工作量。

此外,这样只能做粗略的问题定位,并且统计到Tick。而对于在c++中实现的函数,并不能统计到,还要根据现象、分析之后,有针对性的加追踪的代码。

既然UE已经有了反射、各个类也都有了名称。我想问问是否有更快捷的方法,可以以较小的修改,捕获到项目中的c++类?

比如:打开个什么设置、或者在自定义类上添加一个meta、或者宏,就可以让一个我们添加的c++类被insight统计。

  1. tick会被统计,会显示类名
  2. 类中自定义的函数调用会被统计,显示类名或函数名。
    [Attachment Removed]

您好,先说结论,我认为没有这样的方法去处理。不知道您在获取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]

感谢,是一个挺好的思路

[Attachment Removed]