C++ を使用して UE エンジンを開発する場合、関数実行の実行効率を監視する必要がある場合がありますが、このときの使用方法は 2 つあります。
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);
}
このようにして、レベルの実行時に関数の具体的な実行時間が表示されます。
以下はこのアクターの完全なコードです。自分でテストできます。
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.cpp8
// 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");
}
}