Files
rougeGame/Source/UEAdapter/Public/IronsPerformanceSubsystem.h

47 lines
1.6 KiB
C++

#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "Tickable.h"
#include "IronsPerformanceSubsystem.generated.h"
// UE telemetry only. A negative value means that no valid measurement is available.
struct UEADAPTER_API FIronsPerformanceSnapshot
{
double Fps=-1,FrameMs=-1,GameMs=-1,RenderMs=-1,RhiMs=-1,GpuMs=-1;
int32 Samples=0;
uint64 Revision=0;
};
class UEADAPTER_API FIronsPerformanceWindow
{
struct FSample { double End=0,Seconds=0,Game=-1,Render=-1,Rhi=-1,Gpu=-1; };
TArray<FSample> Samples;
public:
void Reset();
void Add(double End,double Seconds,double Game,double Render,double Rhi,double Gpu);
FIronsPerformanceSnapshot Read(double Now) const;
};
UCLASS()
class UEADAPTER_API UIronsPerformanceSubsystem : public UGameInstanceSubsystem, public FTickableGameObject
{
GENERATED_BODY()
FIronsPerformanceWindow Window;
FIronsPerformanceSnapshot Snapshot,Raw;
TWeakObjectPtr<UWorld> SampleWorld;
double LastSampleTime=0,LastPublishTime=0;
uint64 LastFrame=MAX_uint64;
bool bInitialized=false;
public:
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
virtual void Tick(float DeltaTime) override;
virtual TStatId GetStatId() const override;
virtual bool IsTickable() const override;
virtual bool IsTickableWhenPaused() const override { return true; }
virtual UWorld* GetTickableGameObjectWorld() const override;
const FIronsPerformanceSnapshot& GetSnapshot() const { return Snapshot; }
const FIronsPerformanceSnapshot& GetRawSample() const { return Raw; }
};