#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 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 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; } };