Perfs monitor update

This commit is contained in:
JackCarterSmith 2024-09-27 23:47:12 +02:00
parent d152296d43
commit 1946f16385
Signed by: JackCarterSmith
GPG Key ID: 832E52F4E23F8F24
4 changed files with 23 additions and 12 deletions

View File

@ -14,9 +14,10 @@ DebugUI::DebugUI() {
gDbgText.setFillColor(sf::Color::White); gDbgText.setFillColor(sf::Color::White);
} }
void DebugUI::UpdateDebugData(const double cpu_usage, const double loop_time, const int fps, const std::size_t ram_virt_usage, const std::size_t ram_phys_usage) { void DebugUI::UpdateDebugData(const double cpu_usage, const double cpu_time, const double cycle_time, const int fps, const std::size_t ram_virt_usage, const std::size_t ram_phys_usage) {
gDbgStats.cpu_usage = cpu_usage; gDbgStats.cpu_usage = cpu_usage;
gDbgStats.loop_time = loop_time; gDbgStats.cpu_time = cpu_time;
gDbgStats.cycle_time = cycle_time;
gDbgStats.fps = fps; gDbgStats.fps = fps;
gDbgStats.ram_virt_usage = ram_virt_usage; gDbgStats.ram_virt_usage = ram_virt_usage;
gDbgStats.ram_phys_usage = ram_phys_usage; gDbgStats.ram_phys_usage = ram_phys_usage;
@ -26,7 +27,7 @@ void DebugUI::DrawDebugData(std::shared_ptr<sf::RenderWindow> context) {
std::ostringstream outStrStream; std::ostringstream outStrStream;
outStrStream << std::fixed; outStrStream << std::fixed;
outStrStream << std::setprecision(0) << "CPU: " << gDbgStats.cpu_usage << "% (cycle time: " << std::setprecision(3) << gDbgStats.loop_time << "ms)" << std::endl; outStrStream << std::setprecision(0) << "CPU: " << gDbgStats.cpu_usage << "% (cycle: " << std::setprecision(3) << gDbgStats.cpu_time << "/" << gDbgStats.cycle_time << "ms)" << std::endl;
outStrStream << std::setprecision(1) << "RAM: " << gDbgStats.ram_virt_usage << "MB(V) / " << gDbgStats.ram_phys_usage << "MB(P)" << std::endl; outStrStream << std::setprecision(1) << "RAM: " << gDbgStats.ram_virt_usage << "MB(V) / " << gDbgStats.ram_phys_usage << "MB(P)" << std::endl;
outStrStream << std::setprecision(0) << "FPS: " << gDbgStats.fps; outStrStream << std::setprecision(0) << "FPS: " << gDbgStats.fps;

View File

@ -10,7 +10,8 @@
struct sDbgStats { struct sDbgStats {
double cpu_usage; double cpu_usage;
double loop_time; double cpu_time;
double cycle_time;
int fps; int fps;
std::size_t ram_virt_usage; std::size_t ram_virt_usage;
std::size_t ram_phys_usage; std::size_t ram_phys_usage;
@ -21,7 +22,7 @@ public:
DebugUI(); DebugUI();
~DebugUI() {} ~DebugUI() {}
void UpdateDebugData(const double cpu_usage, const double loop_time, const int fps, const std::size_t ram_virt_usage, const std::size_t ram_phys_usage); void UpdateDebugData(const double cpu_usage, const double cpu_time, const double cycle_time, const int fps, const std::size_t ram_virt_usage, const std::size_t ram_phys_usage);
void DrawDebugData(std::shared_ptr<sf::RenderWindow> context); void DrawDebugData(std::shared_ptr<sf::RenderWindow> context);
private: private:

View File

@ -75,7 +75,7 @@ WorldUI::WorldUI() : UI() {
sViewSettings.antialiasingLevel = 8; sViewSettings.antialiasingLevel = 8;
sViewSettings.sRgbCapable = true; sViewSettings.sRgbCapable = true;
if (!mUIRender.create(1280, 560, sViewSettings)) // Only the upper of the screen is renderer as the UI hide whats left. if (!mUIRender.create(1280, 324, sViewSettings)) // Only the upper of the screen is renderer as the UI hide whats left.
throw std::runtime_error("Texture renderer creation failure"); throw std::runtime_error("Texture renderer creation failure");
mUIRender.setSmooth(true); mUIRender.setSmooth(true);

View File

@ -1,6 +1,7 @@
#include "Game.hpp" #include "Game.hpp"
#include "icon.h" #include "icon.h"
#include <iostream>
#include <numeric> #include <numeric>
#include <SFML/System.hpp> #include <SFML/System.hpp>
@ -54,16 +55,18 @@ void Game::InitWindows() {
GAME_STATUS Game::Tick(SysTimer& time) { GAME_STATUS Game::Tick(SysTimer& time) {
static std::vector<double> msTicksMonitoring; static std::vector<double> msTicksMonitoring;
static double mPrevdelta = 0; static double mPrevdelta = 0;
static double mLastCycleSleepDelta = 0;
static unsigned int mFrameCnt = 0; static unsigned int mFrameCnt = 0;
double mDelta = time.GetDeltaTimeUs(); double mDelta = time.GetDeltaTimeUs();
// Debug performance computations // Debug performance computations
if (mDbgUI != nullptr && mPerfsTimer != nullptr) { if (mDbgUI != nullptr && mPerfsTimer != nullptr) {
msTicksMonitoring.push_back((mDelta - mPrevdelta) / (1000000.f / TARGET_FPS)); msTicksMonitoring.push_back(((1000000.f / TARGET_FPS) - mLastCycleSleepDelta) * TARGET_FPS / 1000000.f);
if (mPerfsTimer->GetDeltaTime() >= 1000) { // Every 1s if (mPerfsTimer->GetDeltaTime() >= 1000) { // Every 1s
double cpuUsage = 100 * std::accumulate(msTicksMonitoring.begin(), msTicksMonitoring.end(), (double)(0)) / msTicksMonitoring.size(); // This average CPU/cycle_time method can monitor when CPU is in overload state (>0%) or in underload one (<0%)
double cpuUsage = 200 * std::accumulate(msTicksMonitoring.begin(), msTicksMonitoring.end(), (double)(0)) / msTicksMonitoring.size() - 100;
mDbgUI->UpdateDebugData(cpuUsage, ((mDelta - mPrevdelta) / 1000), mFrameCnt, (PerfsGetVirtMem() / 1000), (PerfsGetPhysMem() / 1000)); mDbgUI->UpdateDebugData(cpuUsage, (((1000000.f / TARGET_FPS) - mLastCycleSleepDelta) / 1000), ((-mPrevdelta + time.GetDeltaTimeUs()) / 1000), mFrameCnt, (PerfsGetVirtMem() / 1000), (PerfsGetPhysMem() / 1000));
mFrameCnt = 0; mFrameCnt = 0;
msTicksMonitoring.clear(); msTicksMonitoring.clear();
@ -88,10 +91,16 @@ GAME_STATUS Game::Tick(SysTimer& time) {
Render(); Render();
mFrameCnt++; mFrameCnt++;
time.Reset(); time.Reset();
mPrevdelta = -mDelta; mDelta = -mDelta;
} else {
mPrevdelta = mDelta;
} }
mPrevdelta = mDelta;
// Sleep for remaining time to avoid useless CPU usage
mLastCycleSleepDelta = (1000000.f / TARGET_FPS) - (-mPrevdelta + time.GetDeltaTimeUs());
if (mLastCycleSleepDelta > 0)
sf::sleep(sf::microseconds(mLastCycleSleepDelta));
else
mLastCycleSleepDelta = 0;
// Return the current process stat to the head process (TODO: convert to thread) // Return the current process stat to the head process (TODO: convert to thread)
if (mMainWindow->isOpen()) if (mMainWindow->isOpen())