RealtimeStyleTransferRuntime/Source/LyraGame/Performance/LyraPerformanceStatSubsyste...

131 lines
4.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "LyraPerformanceStatSubsystem.h"
#include "Engine/Engine.h"
#include "Engine/GameInstance.h"
#include "Engine/NetConnection.h"
#include "Engine/World.h"
#include "GameFramework/PlayerController.h"
#include "GameFramework/PlayerState.h"
#include "GameModes/LyraGameState.h"
#include "HAL/Platform.h"
#include "Performance/LyraPerformanceStatTypes.h"
#include "Templates/Casts.h"
class FSubsystemCollectionBase;
//////////////////////////////////////////////////////////////////////
// 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<ALyraGameState>())
{
CachedServerFPS = GameState->GetServerFPS();
}
if (APlayerController* LocalPC = GEngine->GetFirstLocalPlayerController(World))
{
if (APlayerState* PS = LocalPC->GetPlayerState<APlayerState>())
{
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<FLyraPerformanceStatCache>(this);
GEngine->AddPerformanceDataConsumer(Tracker);
}
void ULyraPerformanceStatSubsystem::Deinitialize()
{
GEngine->RemovePerformanceDataConsumer(Tracker);
Tracker.Reset();
}
double ULyraPerformanceStatSubsystem::GetCachedStat(ELyraDisplayablePerformanceStat Stat) const
{
return Tracker->GetCachedStat(Stat);
}