在使用C++开发UE引擎,有时候需要监控函数的执行的执行效率,这个时候有两种方式可以使用。
目录(Contents)
1. 执行代码耗时时间
double ThisTime = 0;
{
SCOPE_SECONDS_COUNTER(ThisTime);
// ...
// 一串代码
// ...
}
UE_LOG(LogTemp, Log, TEXT("Stats::Broadcast %.2f"), ThisTime);
这样就可以输出这一段代码消耗时间,此方法会捕获时间(以秒为单位传递),并将增量时间添加到传入的变量。
2. 函数每帧监控
在一些函数是每帧都要执行的时候,那就可以用UE的统计系统来显示,这样更方便。
先在CPP定义一个自定义监听组
DECLARE_STATS_GROUP(TEXT("DTActor"), STATGROUP_DTActor, STATCAT_Test);
这样启动程序的时候, 就可以看到自己定义的组
然后需要定义函数监听模块
DECLARE_CYCLE_STAT(TEXT("DTActor Tick"), STAT_Tick, STATGROUP_DTActor);
DECLARE_CYCLE_STAT(TEXT("DTActor Call"), STAT_Call, STATGROUP_DTActor);
并在相应的函数中启动相应模块
void ADTActor::Tick(float DeltaTime)
{
SCOPE_CYCLE_COUNTER(STAT_Tick);
Super::Tick(DeltaTime);
}
void ADTActor::Call()
{
SCOPE_CYCLE_COUNTER(STAT_Call);
}
这样在运行关卡的时候就会显示函数的具体执行时间
以下是这个Actor的完整代码,可以自己测试一下。
DTActor.h
// Copyright 2023 Dexter.Wan. All Rights Reserved.
// EMail: [email protected]
// Website: https://dt.cq.cn/
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DTActor.generated.h"
UCLASS()
class DTMOVIE_API ADTActor : public AActor
{
GENERATED_BODY()
public:
ADTActor();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
void Call();
};
DTActor.cpp
// Copyright 2023 Dexter.Wan. All Rights Reserved.
// EMail: [email protected]
// Website: https://dt.cq.cn/
#include "DTActor.h"
DECLARE_STATS_GROUP(TEXT("DTActor"), STATGROUP_DTActor, STATCAT_Test);
DECLARE_CYCLE_STAT(TEXT("DTActor Tick"), STAT_Tick, STATGROUP_DTActor);
DECLARE_CYCLE_STAT(TEXT("DTActor Call"), STAT_Call, STATGROUP_DTActor);
ADTActor::ADTActor()
{
PrimaryActorTick.bCanEverTick = true;
}
void ADTActor::BeginPlay()
{
Super::BeginPlay();
}
void ADTActor::Tick(float DeltaTime)
{
SCOPE_CYCLE_COUNTER(STAT_Tick);
Super::Tick(DeltaTime);
FString S;
for ( int n = 0; n < 50000; ++n )
{
S += TEXT("1");
}
Call();
Call();
}
void ADTActor::Call()
{
SCOPE_CYCLE_COUNTER(STAT_Call);
FString S;
for ( int n = 0; n < 50000; ++n )
{
S += TEXT("1");
}
}