[Unreal Engine] UE は、各フレーム サイクルでの C++ 関数のパフォーマンス、関数の消費時間、関数の効率、関数の実行時間を監視します。

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");
	}
}

80 年代以降のプログラマーicon-default.png?t=N6B9https://dt.cq.cn/archives/357

おすすめ

転載: blog.csdn.net/wmy19890322/article/details/131944569