From 93076dc36d62a6a34fb310863c18ca2342c17468 Mon Sep 17 00:00:00 2001 From: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> Date: Mon, 8 Jun 2026 21:42:32 -0700 Subject: [PATCH] chore: simplify metrics (#1987) * chore: simplify metrics rename to hpp and remove unused includes * feedback --- dCommon/Metrics.cpp | 144 +++++------------- dCommon/Metrics.h | 48 ++++++ dCommon/Metrics.hpp | 61 -------- dGame/EntityManager.cpp | 1 - dGame/LeaderboardManager.cpp | 3 +- dGame/dComponents/BaseCombatAIComponent.cpp | 1 - .../SlashCommands/DEVGMCommands.cpp | 18 +-- dWorldServer/WorldServer.cpp | 3 +- 8 files changed, 100 insertions(+), 179 deletions(-) create mode 100644 dCommon/Metrics.h delete mode 100644 dCommon/Metrics.hpp diff --git a/dCommon/Metrics.cpp b/dCommon/Metrics.cpp index 5232cf78..f196bde6 100644 --- a/dCommon/Metrics.cpp +++ b/dCommon/Metrics.cpp @@ -1,105 +1,77 @@ -#include "Metrics.hpp" +#include "Metrics.h" + +#include "StringifiedEnum.h" #include -std::unordered_map Metrics::m_Metrics = {}; -std::vector Metrics::m_Variables = { - MetricVariable::GameLoop, - MetricVariable::PacketHandling, - MetricVariable::UpdateEntities, - MetricVariable::UpdateSpawners, - MetricVariable::Physics, - MetricVariable::UpdateReplica, - MetricVariable::Ghosting, - MetricVariable::CPUTime, - MetricVariable::Sleep, - MetricVariable::Frame, -}; +namespace { + std::unordered_map g_Metrics = {}; + std::vector g_Variables = { + MetricVariable::GameLoop, + MetricVariable::PacketHandling, + MetricVariable::UpdateEntities, + MetricVariable::UpdateSpawners, + MetricVariable::Physics, + MetricVariable::UpdateReplica, + MetricVariable::Ghosting, + MetricVariable::CPUTime, + MetricVariable::Sleep, + MetricVariable::Frame, + }; +} void Metrics::AddMeasurement(MetricVariable variable, int64_t value) { - const auto& iter = m_Metrics.find(variable); - - Metric* metric; - - if (iter == m_Metrics.end()) { - metric = new Metric(); - - m_Metrics[variable] = metric; - } else { - metric = iter->second; - } + auto& metric = g_Metrics[variable]; AddMeasurement(metric, value); } -void Metrics::AddMeasurement(Metric* metric, int64_t value) { - const auto index = metric->measurementIndex; +void Metrics::AddMeasurement(Metric& metric, int64_t value) { + const auto index = metric.measurementIndex; - metric->measurements[index] = value; + metric.measurements[index] = value; - if (metric->max == -1 || value > metric->max) { - metric->max = value; - } else if (metric->min == -1 || metric->min > value) { - metric->min = value; + if (metric.max == -1 || value > metric.max) { + metric.max = value; + } else if (metric.min == -1 || metric.min > value) { + metric.min = value; } - if (metric->measurementSize < MAX_MEASURMENT_POINTS) { - metric->measurementSize++; + if (metric.measurementSize < MAX_MEASURMENT_POINTS) { + metric.measurementSize++; } - metric->measurementIndex = (index + 1) % MAX_MEASURMENT_POINTS; + metric.measurementIndex = (index + 1) % MAX_MEASURMENT_POINTS; } -const Metric* Metrics::GetMetric(MetricVariable variable) { - const auto& iter = m_Metrics.find(variable); - - if (iter == m_Metrics.end()) { - return nullptr; - } - - Metric* metric = iter->second; +const Metric& Metrics::GetMetric(MetricVariable variable) { + auto& metric = g_Metrics[variable]; int64_t average = 0; - for (size_t i = 0; i < metric->measurementSize; i++) { - average += metric->measurements[i]; + for (size_t i = 0; i < metric.measurementSize; i++) { + average += metric.measurements[i]; } - average /= metric->measurementSize; + average /= metric.measurementSize; - metric->average = average; + metric.average = average; return metric; } void Metrics::StartMeasurement(MetricVariable variable) { - const auto& iter = m_Metrics.find(variable); + auto& metric = g_Metrics[variable]; - Metric* metric; - - if (iter == m_Metrics.end()) { - metric = new Metric(); - - m_Metrics[variable] = metric; - } else { - metric = iter->second; - } - - metric->activeMeasurement = std::chrono::high_resolution_clock::now(); + metric.activeMeasurement = std::chrono::high_resolution_clock::now(); } void Metrics::EndMeasurement(MetricVariable variable) { const auto end = std::chrono::high_resolution_clock::now(); - const auto& iter = m_Metrics.find(variable); + auto& metric = g_Metrics[variable]; - if (iter == m_Metrics.end()) { - return; - } - - Metric* metric = iter->second; - - const auto elapsed = end - metric->activeMeasurement; + const auto elapsed = end - metric.activeMeasurement; const auto nanoseconds = std::chrono::duration_cast(elapsed).count(); @@ -110,44 +82,12 @@ float Metrics::ToMiliseconds(int64_t nanoseconds) { return static_cast(nanoseconds) / 1e6; } -std::string Metrics::MetricVariableToString(MetricVariable variable) { - switch (variable) { - case MetricVariable::GameLoop: - return "GameLoop"; - case MetricVariable::PacketHandling: - return "PacketHandling"; - case MetricVariable::UpdateEntities: - return "UpdateEntities"; - case MetricVariable::UpdateSpawners: - return "UpdateSpawners"; - case MetricVariable::Physics: - return "Physics"; - case MetricVariable::UpdateReplica: - return "UpdateReplica"; - case MetricVariable::Sleep: - return "Sleep"; - case MetricVariable::CPUTime: - return "CPUTime"; - case MetricVariable::Frame: - return "Frame"; - case MetricVariable::Ghosting: - return "Ghosting"; - - default: - return "Invalid"; - } +const std::string_view Metrics::MetricVariableToString(MetricVariable variable) { + return StringifiedEnum::ToString(variable); } const std::vector& Metrics::GetAllMetrics() { - return m_Variables; -} - -void Metrics::Clear() { - for (const auto& pair : m_Metrics) { - delete pair.second; - } - - m_Metrics.clear(); + return g_Variables; } /* RSS Memory utilities diff --git a/dCommon/Metrics.h b/dCommon/Metrics.h new file mode 100644 index 00000000..ddf9bf09 --- /dev/null +++ b/dCommon/Metrics.h @@ -0,0 +1,48 @@ +#pragma once + +#include "dCommonVars.h" +#include +#include +#include +#include +#include + +#define MAX_MEASURMENT_POINTS 1024 + +enum class MetricVariable : int32_t { + GameLoop, + PacketHandling, + UpdateEntities, + UpdateSpawners, + Physics, + UpdateReplica, + Ghosting, + CPUTime, + Sleep, + Frame, +}; + +struct Metric { + int64_t measurements[MAX_MEASURMENT_POINTS] = {}; + size_t measurementIndex = 0; + size_t measurementSize = 0; + int64_t max = -1; + int64_t min = -1; + int64_t average = 0; + std::chrono::time_point activeMeasurement; +}; + +namespace Metrics { + void AddMeasurement(MetricVariable variable, int64_t value); + void AddMeasurement(Metric& metric, int64_t value); + const Metric& GetMetric(MetricVariable variable); + void StartMeasurement(MetricVariable variable); + void EndMeasurement(MetricVariable variable); + float ToMiliseconds(int64_t nanoseconds); + const std::string_view MetricVariableToString(MetricVariable variable); + const std::vector& GetAllMetrics(); + + size_t GetPeakRSS(); + size_t GetCurrentRSS(); + size_t GetProcessID(); +}; diff --git a/dCommon/Metrics.hpp b/dCommon/Metrics.hpp deleted file mode 100644 index c03c914f..00000000 --- a/dCommon/Metrics.hpp +++ /dev/null @@ -1,61 +0,0 @@ -#pragma once - -#include "dCommonVars.h" -#include -#include -#include -#include - -#define MAX_MEASURMENT_POINTS 1024 - -enum class MetricVariable : int32_t -{ - GameLoop, - PacketHandling, - UpdateEntities, - UpdateSpawners, - Physics, - UpdateReplica, - Ghosting, - CPUTime, - Sleep, - Frame, -}; - -struct Metric -{ - int64_t measurements[MAX_MEASURMENT_POINTS] = {}; - size_t measurementIndex = 0; - size_t measurementSize = 0; - int64_t max = -1; - int64_t min = -1; - int64_t average = 0; - std::chrono::time_point activeMeasurement; -}; - -class Metrics -{ -public: - ~Metrics(); - - static void AddMeasurement(MetricVariable variable, int64_t value); - static void AddMeasurement(Metric* metric, int64_t value); - static const Metric* GetMetric(MetricVariable variable); - static void StartMeasurement(MetricVariable variable); - static void EndMeasurement(MetricVariable variable); - static float ToMiliseconds(int64_t nanoseconds); - static std::string MetricVariableToString(MetricVariable variable); - static const std::vector& GetAllMetrics(); - - static size_t GetPeakRSS(); - static size_t GetCurrentRSS(); - static size_t GetProcessID(); - - static void Clear(); - -private: - Metrics(); - - static std::unordered_map m_Metrics; - static std::vector m_Variables; -}; diff --git a/dGame/EntityManager.cpp b/dGame/EntityManager.cpp index 92258afc..fee2b66a 100644 --- a/dGame/EntityManager.cpp +++ b/dGame/EntityManager.cpp @@ -10,7 +10,6 @@ #include "SkillComponent.h" #include "SwitchComponent.h" #include "UserManager.h" -#include "Metrics.hpp" #include "dZoneManager.h" #include "MissionComponent.h" #include "Game.h" diff --git a/dGame/LeaderboardManager.cpp b/dGame/LeaderboardManager.cpp index a6f13c65..b8e40154 100644 --- a/dGame/LeaderboardManager.cpp +++ b/dGame/LeaderboardManager.cpp @@ -18,7 +18,8 @@ #include "DluAssert.h" #include "CDActivitiesTable.h" -#include "Metrics.hpp" + +#include namespace LeaderboardManager { std::map leaderboardCache; diff --git a/dGame/dComponents/BaseCombatAIComponent.cpp b/dGame/dComponents/BaseCombatAIComponent.cpp index 5f6399da..b97211b8 100644 --- a/dGame/dComponents/BaseCombatAIComponent.cpp +++ b/dGame/dComponents/BaseCombatAIComponent.cpp @@ -23,7 +23,6 @@ #include "SkillComponent.h" #include "QuickBuildComponent.h" #include "DestroyableComponent.h" -#include "Metrics.hpp" #include "CDComponentsRegistryTable.h" #include "CDPhysicsComponentTable.h" #include "dNavMesh.h" diff --git a/dGame/dUtilities/SlashCommands/DEVGMCommands.cpp b/dGame/dUtilities/SlashCommands/DEVGMCommands.cpp index f1b92e26..f5dbd29f 100644 --- a/dGame/dUtilities/SlashCommands/DEVGMCommands.cpp +++ b/dGame/dUtilities/SlashCommands/DEVGMCommands.cpp @@ -13,7 +13,7 @@ #include "dpShapeSphere.h" #include "dZoneManager.h" #include "EntityInfo.h" -#include "Metrics.hpp" +#include "Metrics.h" #include "PlayerManager.h" #include "SlashCommandHandler.h" #include "UserManager.h" @@ -1288,18 +1288,14 @@ namespace DEVGMCommands { response.Insert("serverInfo", true); auto* info = response.InsertArray("data"); for (const auto variable : Metrics::GetAllMetrics()) { - auto& metricData = info->PushDebug(StringifiedEnum::ToString(variable)); + auto& metricData = info->PushDebug(Metrics::MetricVariableToString(variable)); - auto* metric = Metrics::GetMetric(variable); + const auto& metric = Metrics::GetMetric(variable); - if (metric == nullptr) { - continue; - } - - metricData.PushDebug("Maximum") = std::to_string(Metrics::ToMiliseconds(metric->max)) + "ms"; - metricData.PushDebug("Minimum") = std::to_string(Metrics::ToMiliseconds(metric->min)) + "ms"; - metricData.PushDebug("Average") = std::to_string(Metrics::ToMiliseconds(metric->average)) + "ms"; - metricData.PushDebug("Measurements Count") = std::to_string(metric->measurementSize); + metricData.PushDebug("Maximum") = std::to_string(Metrics::ToMiliseconds(metric.max)) + "ms"; + metricData.PushDebug("Minimum") = std::to_string(Metrics::ToMiliseconds(metric.min)) + "ms"; + metricData.PushDebug("Average") = std::to_string(Metrics::ToMiliseconds(metric.average)) + "ms"; + metricData.PushDebug("Measurements Count") = std::to_string(metric.measurementSize); } auto& processInfo = info->PushDebug("Process Info"); processInfo.PushDebug("Peak RSS") = std::to_string(static_cast(Metrics::GetPeakRSS()) / 1.024e6) + "MB"; diff --git a/dWorldServer/WorldServer.cpp b/dWorldServer/WorldServer.cpp index 48a11cf2..8de1d4e5 100644 --- a/dWorldServer/WorldServer.cpp +++ b/dWorldServer/WorldServer.cpp @@ -14,7 +14,7 @@ #include "dConfig.h" #include "dpWorld.h" #include "dZoneManager.h" -#include "Metrics.hpp" +#include "Metrics.h" #include "PerformanceManager.h" #include "Diagnostics.h" #include "BinaryPathFinder.h" @@ -1538,7 +1538,6 @@ void FinalizeShutdown() { LOG("Shutdown complete, zone (%i), instance (%i)", Game::server->GetZoneID(), g_InstanceID); //Delete our objects here: - Metrics::Clear(); dpWorld::Shutdown(); Database::Destroy("WorldServer"); if (Game::chatFilter) delete Game::chatFilter;