在RenderCore(.h,.cpp)声明定义profile字段,加入到局部函数,可以通过stat scenerendering指令来打印出相应时间
声明stat Group
DECLARE_STATS_GROUP(TEXT("TestTime"), STATGROUP_TestTime, STATCAT_Advanced);
声明stat Group下的具体标记
DECLARE_STATS_GROUP(TEXT("TestTime"), STATGROUP_TestTime, STATCAT_Advanced);
DECLARE_CYCLE_STAT(TEXT("TestMyActorTick"), STAT_TestMyActorTick, STATGROUP_TestTime);
DECLARE_CYCLE_STAT(TEXT("TestMyActorCal"), STAT_TestMyActorCal, STATGROUP_TestTime);
DECLARE_CYCLE_STAT(TEXT("TestMyActorCount"), STAT_TestMyActorCount, STATGROUP_TestTime);
SCOPE_CYCLE_COUNTER给一段程序打上标记,从标记到从该段程序退出的时间则为这个标记执行的事件
来一个例子,下面的actor tick做了两次累加函数,用三个标记分别标记Tick, Test, Test1三个函数。
DECLARE_STATS_GROUP(TEXT("TestTime"), STATGROUP_TestTime, STATCAT_Advanced);
DECLARE_CYCLE_STAT(TEXT("TestMyActorTick"), STAT_TestMyActorTick, STATGROUP_TestTime);
DECLARE_CYCLE_STAT(TEXT("TestMyActorCal"), STAT_TestMyActorCal, STATGROUP_TestTime);
DECLARE_CYCLE_STAT(TEXT("TestMyActorCount"), STAT_TestMyActorCount, STATGROUP_TestTime);
UCLASS()
class TESTHOUDINIPROJECT_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
UPROPERTY(EditAnywhere)
int32 Count1;
UPROPERTY(EditAnywhere)
int32 Count2;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
private:
void Test(int32 Count);
void Test1(int32 Count);
};
void AMyActor::Tick(float DeltaTime)
{
SCOPE_CYCLE_COUNTER(STAT_TestMyActorTick);
Super::Tick(DeltaTime);
Test(Count1);
Test1(Count2);
}
void AMyActor::Test(int32 Count)
{
SCOPE_CYCLE_COUNTER(STAT_TestMyActorCal);
int64 Total = 0;
for (int32 Index = 0; Index < Count; ++Index)
{
Total += 1;
}
}
void AMyActor::Test1(int32 Count)
{
SCOPE_CYCLE_COUNTER(STAT_TestMyActorCount);
int64 Total = 0;
for (int32 Index = 0; Index < Count; ++Index)
{
Total += 1;
}
}
从Count2 = 3Count1推测 Time(Test1) = 3Time(Test)
Stat TestTime可以探查STATGROUP_TestTime这个组的所有标记阶段执行事件
Stat StartFile & Stat StopFile是执行CPU执行事件片段的命令, Stat StartFile开始执行CPU执行事件抓取,Stat StopFile结束抓取CPU执行事件片段,并生成一个统计文件。
Tools->SessionFrontend打开Profile工具
点Load按钮对目标统计文件加载
统计组: 可以查看对应标记组之下每个标记在整个统计阶段的Min/Avg/Max执行时间
统计事件列表: 选中某一帧之后,可以查看一帧数下各个标记执行的时间
从上面可以看出TestMyActorTick花了6.528ms
可以看到TestMyActorCount标记的Test1函数执行时间差不多是TestMyActorCal执行函数Test的三倍。
[1]这里得注意的是上面图显示是这个标记执行的总时间,而非是执行一次这个标记的时间,假设你调用100次被标记函数的循环,这个标记执行的时间 = 100次这个函数执行总时间。
[2]Self表示当前函数内除了函数内的所有标记外的执行时间
[1]https://docs.unrealengine.com/5.0/zh-CN/stat-commands-in-unreal-engine/