// Copyright Epic Games, Inc. All Rights Reserved. #include "LyraPerformanceStatSubsystem.h" #include "GameFramework/PlayerController.h" #include "GameFramework/PlayerState.h" #include "Engine/World.h" #include "Engine/Engine.h" #include "Engine/NetConnection.h" #include "GameModes/LyraGameState.h" ////////////////////////////////////////////////////////////////////// // FLyraPerformanceStatCache void FLyraPerformanceStatCache::StartCharting() { } void FLyraPerformanceStatCache::ProcessFrame(const FFrameData& FrameData) { CachedData = FrameData; CachedServerFPS = 0.0f; CachedPingMS = 0.0f; CachedPacketLossIncomingPercent = 0.0f; CachedPacketLossOutgoingPercent = 0.0f; CachedPacketRateIncoming = 0.0f; CachedPacketRateOutgoing = 0.0f; CachedPacketSizeIncoming = 0.0f; CachedPacketSizeOutgoing = 0.0f; if (UWorld* World = MySubsystem->GetGameInstance()->GetWorld()) { if (const ALyraGameState* GameState = World->GetGameState()) { CachedServerFPS = GameState->GetServerFPS(); } if (APlayerController* LocalPC = GEngine->GetFirstLocalPlayerController(World)) { if (APlayerState* PS = LocalPC->GetPlayerState()) { CachedPingMS = PS->GetPingInMilliseconds(); } if (UNetConnection* NetConnection = LocalPC->GetNetConnection()) { const UNetConnection::FNetConnectionPacketLoss& InLoss = NetConnection->GetInLossPercentage(); CachedPacketLossIncomingPercent = InLoss.GetAvgLossPercentage(); const UNetConnection::FNetConnectionPacketLoss& OutLoss = NetConnection->GetOutLossPercentage(); CachedPacketLossOutgoingPercent = OutLoss.GetAvgLossPercentage(); CachedPacketRateIncoming = NetConnection->InPacketsPerSecond; CachedPacketRateOutgoing = NetConnection->OutPacketsPerSecond; CachedPacketSizeIncoming = (NetConnection->InPacketsPerSecond != 0) ? (NetConnection->InBytesPerSecond / (float)NetConnection->InPacketsPerSecond) : 0.0f; CachedPacketSizeOutgoing = (NetConnection->OutPacketsPerSecond != 0) ? (NetConnection->OutBytesPerSecond / (float)NetConnection->OutPacketsPerSecond) : 0.0f; } } } } void FLyraPerformanceStatCache::StopCharting() { } double FLyraPerformanceStatCache::GetCachedStat(ELyraDisplayablePerformanceStat Stat) const { static_assert((int32)ELyraDisplayablePerformanceStat::Count == 15, "Need to update this function to deal with new performance stats"); switch (Stat) { case ELyraDisplayablePerformanceStat::ClientFPS: return (CachedData.TrueDeltaSeconds != 0.0) ? (1.0 / CachedData.TrueDeltaSeconds) : 0.0; case ELyraDisplayablePerformanceStat::ServerFPS: return CachedServerFPS; case ELyraDisplayablePerformanceStat::IdleTime: return CachedData.IdleSeconds; case ELyraDisplayablePerformanceStat::FrameTime: return CachedData.TrueDeltaSeconds; case ELyraDisplayablePerformanceStat::FrameTime_GameThread: return CachedData.GameThreadTimeSeconds; case ELyraDisplayablePerformanceStat::FrameTime_RenderThread: return CachedData.RenderThreadTimeSeconds; case ELyraDisplayablePerformanceStat::FrameTime_RHIThread: return CachedData.RHIThreadTimeSeconds; case ELyraDisplayablePerformanceStat::FrameTime_GPU: return CachedData.GPUTimeSeconds; case ELyraDisplayablePerformanceStat::Ping: return CachedPingMS; case ELyraDisplayablePerformanceStat::PacketLoss_Incoming: return CachedPacketLossIncomingPercent; case ELyraDisplayablePerformanceStat::PacketLoss_Outgoing: return CachedPacketLossOutgoingPercent; case ELyraDisplayablePerformanceStat::PacketRate_Incoming: return CachedPacketRateIncoming; case ELyraDisplayablePerformanceStat::PacketRate_Outgoing: return CachedPacketRateOutgoing; case ELyraDisplayablePerformanceStat::PacketSize_Incoming: return CachedPacketSizeIncoming; case ELyraDisplayablePerformanceStat::PacketSize_Outgoing: return CachedPacketSizeOutgoing; } return 0.0f; } ////////////////////////////////////////////////////////////////////// // ULyraPerformanceStatSubsystem void ULyraPerformanceStatSubsystem::Initialize(FSubsystemCollectionBase& Collection) { Tracker = MakeShared(this); GEngine->AddPerformanceDataConsumer(Tracker); } void ULyraPerformanceStatSubsystem::Deinitialize() { GEngine->RemovePerformanceDataConsumer(Tracker); Tracker.Reset(); } double ULyraPerformanceStatSubsystem::GetCachedStat(ELyraDisplayablePerformanceStat Stat) const { return Tracker->GetCachedStat(Stat); }