124 lines
4.5 KiB
C++
124 lines
4.5 KiB
C++
|
// 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<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);
|
||
|
}
|