Add Agrarian performance profiling markers

This commit is contained in:
2026-05-16 11:01:46 -07:00
parent e50745dbdd
commit 82463f3b99
11 changed files with 196 additions and 1 deletions
@@ -2,8 +2,10 @@
#include "AgrarianFoliagePatch.h"
#include "AgrarianPerformanceStats.h"
#include "Components/HierarchicalInstancedStaticMeshComponent.h"
#include "Components/SceneComponent.h"
#include "ProfilingDebugging/CpuProfilerTrace.h"
namespace
{
@@ -47,6 +49,9 @@ AAgrarianFoliagePatch::AAgrarianFoliagePatch()
void AAgrarianFoliagePatch::ClearFoliage()
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianFoliageInstanceMutation);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianFoliageClear);
if (TreeInstances)
{
TreeInstances->ClearInstances();
@@ -65,16 +70,25 @@ void AAgrarianFoliagePatch::ClearFoliage()
int32 AAgrarianFoliagePatch::AddTreeInstance(const FTransform& InstanceTransform)
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianFoliageInstanceMutation);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianFoliageAddTreeInstance);
return TreeInstances ? TreeInstances->AddInstance(InstanceTransform, true) : INDEX_NONE;
}
int32 AAgrarianFoliagePatch::AddShrubInstance(const FTransform& InstanceTransform)
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianFoliageInstanceMutation);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianFoliageAddShrubInstance);
return ShrubInstances ? ShrubInstances->AddInstance(InstanceTransform, true) : INDEX_NONE;
}
int32 AAgrarianFoliagePatch::AddGrassInstance(const FTransform& InstanceTransform)
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianFoliageInstanceMutation);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianFoliageAddGrassInstance);
return GrassInstances ? GrassInstances->AddInstance(InstanceTransform, true) : INDEX_NONE;
}
@@ -1,7 +1,9 @@
// Copyright Pacificao. All Rights Reserved.
#include "AgrarianGameState.h"
#include "AgrarianPerformanceStats.h"
#include "Net/UnrealNetwork.h"
#include "ProfilingDebugging/CpuProfilerTrace.h"
namespace
{
@@ -70,6 +72,9 @@ void AAgrarianGameState::BeginPlay()
void AAgrarianGameState::Tick(float DeltaSeconds)
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianGameStateTick);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianGameStateTick);
Super::Tick(DeltaSeconds);
if (!HasAuthority())
@@ -0,0 +1,11 @@
// Copyright Pacificao. All Rights Reserved.
#include "AgrarianPerformanceStats.h"
DEFINE_STAT(STAT_AgrarianGameStateTick);
DEFINE_STAT(STAT_AgrarianSurvivalTick);
DEFINE_STAT(STAT_AgrarianSkyLightingRefresh);
DEFINE_STAT(STAT_AgrarianWeatherAudioRefresh);
DEFINE_STAT(STAT_AgrarianFoliageInstanceMutation);
DEFINE_STAT(STAT_AgrarianWeatherProviderRequest);
DEFINE_STAT(STAT_AgrarianWeatherProviderParse);
@@ -0,0 +1,15 @@
// Copyright Pacificao. All Rights Reserved.
#pragma once
#include "Stats/Stats.h"
DECLARE_STATS_GROUP(TEXT("Agrarian"), STATGROUP_Agrarian, STATCAT_Advanced);
DECLARE_CYCLE_STAT_EXTERN(TEXT("Game State Tick"), STAT_AgrarianGameStateTick, STATGROUP_Agrarian, AGRARIANGAME_API);
DECLARE_CYCLE_STAT_EXTERN(TEXT("Survival Tick"), STAT_AgrarianSurvivalTick, STATGROUP_Agrarian, AGRARIANGAME_API);
DECLARE_CYCLE_STAT_EXTERN(TEXT("Sky Lighting Refresh"), STAT_AgrarianSkyLightingRefresh, STATGROUP_Agrarian, AGRARIANGAME_API);
DECLARE_CYCLE_STAT_EXTERN(TEXT("Weather Audio Refresh"), STAT_AgrarianWeatherAudioRefresh, STATGROUP_Agrarian, AGRARIANGAME_API);
DECLARE_CYCLE_STAT_EXTERN(TEXT("Foliage Instance Mutation"), STAT_AgrarianFoliageInstanceMutation, STATGROUP_Agrarian, AGRARIANGAME_API);
DECLARE_CYCLE_STAT_EXTERN(TEXT("Weather Provider Request"), STAT_AgrarianWeatherProviderRequest, STATGROUP_Agrarian, AGRARIANGAME_API);
DECLARE_CYCLE_STAT_EXTERN(TEXT("Weather Provider Parse"), STAT_AgrarianWeatherProviderParse, STATGROUP_Agrarian, AGRARIANGAME_API);
@@ -3,11 +3,13 @@
#include "AgrarianSkyLightingController.h"
#include "AgrarianGameState.h"
#include "AgrarianPerformanceStats.h"
#include "Components/DirectionalLightComponent.h"
#include "Components/ExponentialHeightFogComponent.h"
#include "Components/SceneComponent.h"
#include "Components/SkyLightComponent.h"
#include "Engine/World.h"
#include "ProfilingDebugging/CpuProfilerTrace.h"
AAgrarianSkyLightingController::AAgrarianSkyLightingController()
{
@@ -48,6 +50,9 @@ void AAgrarianSkyLightingController::Tick(float DeltaSeconds)
void AAgrarianSkyLightingController::RefreshSkyLighting()
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianSkyLightingRefresh);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianSkyLightingRefresh);
const UWorld* World = GetWorld();
const AAgrarianGameState* GameState = World ? World->GetGameState<AAgrarianGameState>() : nullptr;
if (!GameState)
@@ -2,11 +2,13 @@
#include "AgrarianSurvivalComponent.h"
#include "AgrarianGameState.h"
#include "AgrarianPerformanceStats.h"
#include "AgrarianShelterActor.h"
#include "AgrarianWeatherExposureZone.h"
#include "Components/BoxComponent.h"
#include "Engine/World.h"
#include "Net/UnrealNetwork.h"
#include "ProfilingDebugging/CpuProfilerTrace.h"
UAgrarianSurvivalComponent::UAgrarianSurvivalComponent()
{
@@ -24,6 +26,9 @@ void UAgrarianSurvivalComponent::BeginPlay()
void UAgrarianSurvivalComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianSurvivalTick);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianSurvivalTick);
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (!GetOwner() || !GetOwner()->HasAuthority() || !IsAlive())
@@ -3,9 +3,11 @@
#include "AgrarianWeatherAudioController.h"
#include "AgrarianGameState.h"
#include "AgrarianPerformanceStats.h"
#include "Components/AudioComponent.h"
#include "Components/SceneComponent.h"
#include "Engine/World.h"
#include "ProfilingDebugging/CpuProfilerTrace.h"
AAgrarianWeatherAudioController::AAgrarianWeatherAudioController()
{
@@ -47,6 +49,9 @@ void AAgrarianWeatherAudioController::Tick(float DeltaSeconds)
void AAgrarianWeatherAudioController::RefreshWeatherAudio(float DeltaSeconds)
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianWeatherAudioRefresh);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianWeatherAudioRefresh);
const UWorld* World = GetWorld();
const AAgrarianGameState* GameState = World ? World->GetGameState<AAgrarianGameState>() : nullptr;
if (!GameState)
@@ -2,11 +2,13 @@
#include "AgrarianWeatherProviderSubsystem.h"
#include "AgrarianGameState.h"
#include "AgrarianPerformanceStats.h"
#include "Dom/JsonObject.h"
#include "Engine/World.h"
#include "HttpModule.h"
#include "Interfaces/IHttpResponse.h"
#include "Kismet/GameplayStatics.h"
#include "ProfilingDebugging/CpuProfilerTrace.h"
#include "Serialization/JsonReader.h"
#include "Serialization/JsonSerializer.h"
@@ -24,6 +26,9 @@ bool UAgrarianWeatherProviderSubsystem::RequestWeatherForActiveGameState()
bool UAgrarianWeatherProviderSubsystem::RequestWeatherForTile(FName TileId, float Latitude, float Longitude)
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianWeatherProviderRequest);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianWeatherProviderRequest);
if (TileId == NAME_None)
{
return false;
@@ -172,6 +177,9 @@ void UAgrarianWeatherProviderSubsystem::ClearWeatherSnapshotCache()
bool UAgrarianWeatherProviderSubsystem::ApplyDeterministicFallbackWeather(FName TileId, float Latitude, float Longitude, AAgrarianGameState* GameState)
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianWeatherProviderParse);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianWeatherProviderFallback);
if (!bEnableDeterministicFallbackWeather || !GameState || !GameState->HasAuthority() || TileId == NAME_None)
{
return false;
@@ -356,6 +364,9 @@ void UAgrarianWeatherProviderSubsystem::OnNoaaNwsGridDataResponse(FHttpRequestPt
bool UAgrarianWeatherProviderSubsystem::ParseOpenMeteoForecast(const FString& ResponseContent, FName TileId, float Latitude, float Longitude, FAgrarianWeatherProviderSnapshot& OutSnapshot) const
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianWeatherProviderParse);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianWeatherProviderParseOpenMeteo);
TSharedPtr<FJsonObject> RootObject;
const TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(ResponseContent);
if (!FJsonSerializer::Deserialize(Reader, RootObject) || !RootObject.IsValid())
@@ -427,6 +438,9 @@ bool UAgrarianWeatherProviderSubsystem::ParseOpenMeteoForecast(const FString& Re
bool UAgrarianWeatherProviderSubsystem::ParseNoaaNwsGridData(const FString& ResponseContent, FName TileId, float Latitude, float Longitude, FAgrarianWeatherProviderSnapshot& OutSnapshot) const
{
SCOPE_CYCLE_COUNTER(STAT_AgrarianWeatherProviderParse);
TRACE_CPUPROFILER_EVENT_SCOPE(AgrarianWeatherProviderParseNoaaNws);
TSharedPtr<FJsonObject> RootObject;
const TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(ResponseContent);
if (!FJsonSerializer::Deserialize(Reader, RootObject) || !RootObject.IsValid())