You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UE5.1中记录并保存基础GPU统计数据(计算时长)的最简方案

Unreal Engine 5.1 记录GPU计算时长到文件的最简实现

最简方案:C++ Actor定时记录

不需要蓝图,直接写一个轻量的C++ Actor,放在场景里就能自动按时间记录GPU统计数据到CSV文件,步骤如下:

  1. 创建C++ Actor子类
    在项目中新建一个名为GPUMetricsRecorder的C++ Actor,替换以下代码:

头文件(GPUMetricsRecorder.h)

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "GPUMetricsRecorder.generated.h"

UCLASS()
class YOURPROJECT_API AGPUMetricsRecorder : public AActor
{
    GENERATED_BODY()
    
public:    
    AGPUMetricsRecorder();

protected:
    virtual void BeginPlay() override;
    virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;

private:
    FTimerHandle MetricsTimerHandle;
    FILE* LogFile;

    void RecordMetrics();
};

源文件(GPUMetricsRecorder.cpp)

#include "GPUMetricsRecorder.h"
#include "Stats/Stats.h"
#include "Misc/FileHelper.h"
#include "Misc/Paths.h"

AGPUMetricsRecorder::AGPUMetricsRecorder()
{
    PrimaryActorTick.bCanEverTick = false;
}

void AGPUMetricsRecorder::BeginPlay()
{
    Super::BeginPlay();

    // 生成文件路径:项目Saved/Logs/GPUMetrics.csv
    FString FilePath = FPaths::ProjectSavedDir() / TEXT("Logs/GPUMetrics.csv");
    IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
    PlatformFile.CreateDirectoryTree(*FPaths::GetPath(FilePath));
    
    LogFile = PlatformFile.OpenWrite(*FilePath);
    if (LogFile)
    {
        // 写入CSV表头
        fprintf(LogFile, "Time(s),GPU Compute Time(ms)\n");
        
        // 每0.5秒记录一次,可根据需求调整间隔
        GetWorld()->GetTimerManager().SetTimer(MetricsTimerHandle, this, &AGPUMetricsRecorder::RecordMetrics, 0.5f, true);
    }
}

void AGPUMetricsRecorder::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    Super::EndPlay(EndPlayReason);

    // 关闭文件并清理定时器
    if (LogFile)
    {
        fclose(LogFile);
        LogFile = nullptr;
    }
    GetWorld()->GetTimerManager().ClearTimer(MetricsTimerHandle);
}

void AGPUMetricsRecorder::RecordMetrics()
{
    if (!LogFile) return;

    // 获取当前游戏运行时间(秒)
    float CurrentTime = GetWorld()->GetTimeSeconds();
    
    // 获取GPU计算着色器耗时,可替换为其他统计项
    FStatId ComputeTimeStat = FStats::GetStatId(TEXT("GPU.EComputeShaderTime"));
    float ComputeTimeMs = FStats::GetValue(ComputeTimeStat) / 1000.0f; // 转换为毫秒

    // 写入数据到文件
    fprintf(LogFile, "%.2f,%.4f\n", CurrentTime, ComputeTimeMs);
    fflush(LogFile); // 强制写入磁盘,避免缓存丢失
}
  1. 使用方法
  • 替换代码中的YOURPROJECT为你的项目名称,编译项目
  • 编译完成后,将GPUMetricsRecorder Actor拖入编辑器场景中
  • 运行PIE模式或打包后的游戏,结束后在项目目录/Saved/Logs/GPUMetrics.csv中查看记录的数据

注意事项

  • 确保项目启用统计功能:打开Edit > Project Settings > General Settings > Stat System,勾选Enable Stats
  • 如需记录其他GPU统计项,可在编辑器Window > Developer Tools > Stats面板中找到对应名称,替换代码中的TEXT("GPU.EComputeShaderTime")(比如GPU.ETotalFrameTime对应总GPU帧时间)
  • 可调整定时器间隔(代码中的0.5f)来控制记录频率

内容的提问来源于stack exchange,提问作者Can Celik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:05:18