Added a stats window
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#include "Core/Util/Logging.h"
|
#include "Core/Util/Logging.h"
|
||||||
#include "Core/Util/IfDebug.h"
|
#include "Core/Util/IfDebug.h"
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
#include <numeric>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <imgui/imgui.h>
|
||||||
|
#include "../Common.h"
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "../OpenGL.h"
|
||||||
|
|
||||||
|
class EditorStats
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EditorStats();
|
||||||
|
void Draw(double dt);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// FPS graph
|
||||||
|
const unsigned int m_SampleSize = 100;
|
||||||
|
unsigned int m_FrameCount = 0;
|
||||||
|
std::vector<double> m_FrameTimes;
|
||||||
|
double m_TimeAccumulator = 0.0;
|
||||||
|
double m_AveragedSamplesPerSecond = 10.0;
|
||||||
|
const unsigned int m_AveragedSampleSize = 100;
|
||||||
|
unsigned int m_CurrentAveragedSampleIndex = 0;
|
||||||
|
std::vector<double> m_AveragedSamples;
|
||||||
|
void drawFPSGraph(double dt);
|
||||||
|
|
||||||
|
void drawRAMUsage(double dt);
|
||||||
|
|
||||||
|
void drawVRAMStats(double dt);
|
||||||
|
};
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
#include "../Core/EntityFilePreprocessor.h"
|
#include "../Core/EntityFilePreprocessor.h"
|
||||||
#include "../Core/EntityFileParser.h"
|
#include "../Core/EntityFileParser.h"
|
||||||
#include "EditorGUI.h"
|
#include "EditorGUI.h"
|
||||||
|
#include "EditorStats.h"
|
||||||
|
|
||||||
class EditorSystem : public ImpureSystem
|
class EditorSystem : public ImpureSystem
|
||||||
{
|
{
|
||||||
@@ -28,6 +29,7 @@ private:
|
|||||||
EntityWrapper m_Camera = EntityWrapper::Invalid;
|
EntityWrapper m_Camera = EntityWrapper::Invalid;
|
||||||
DebugCameraInputController<EditorSystem>* m_DebugCameraInputController;
|
DebugCameraInputController<EditorSystem>* m_DebugCameraInputController;
|
||||||
EditorGUI* m_EditorGUI;
|
EditorGUI* m_EditorGUI;
|
||||||
|
EditorStats* m_EditorStats;
|
||||||
|
|
||||||
void OnEntitySelected(EntityWrapper entity);
|
void OnEntitySelected(EntityWrapper entity);
|
||||||
};
|
};
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
#include "Editor/EditorStats.h"
|
||||||
|
#ifdef WIN32
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define NOMINMAX
|
||||||
|
#include <windows.h>
|
||||||
|
#include <psapi.h>
|
||||||
|
#endif
|
||||||
|
#include <GL/wglew.h>
|
||||||
|
|
||||||
|
EditorStats::EditorStats()
|
||||||
|
{
|
||||||
|
m_AveragedSamples.push_back(0.0);
|
||||||
|
m_CurrentAveragedSampleIndex = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorStats::Draw(double dt)
|
||||||
|
{
|
||||||
|
if (ImGui::Begin("Stats")) {
|
||||||
|
drawFPSGraph(dt);
|
||||||
|
drawRAMUsage(dt);
|
||||||
|
drawVRAMStats(dt);
|
||||||
|
}
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorStats::drawFPSGraph(double dt)
|
||||||
|
{
|
||||||
|
if (m_FrameCount < m_SampleSize) {
|
||||||
|
m_FrameTimes.push_back(dt);
|
||||||
|
} else {
|
||||||
|
m_FrameTimes[m_FrameCount % m_SampleSize] = dt;
|
||||||
|
}
|
||||||
|
m_FrameCount++;
|
||||||
|
|
||||||
|
double average = 0.0;
|
||||||
|
double max = 0.0;
|
||||||
|
for (double t : m_FrameTimes) {
|
||||||
|
average += t;
|
||||||
|
max = std::max(max, t);
|
||||||
|
}
|
||||||
|
average /= m_FrameTimes.size();
|
||||||
|
|
||||||
|
m_TimeAccumulator += dt;
|
||||||
|
if (m_TimeAccumulator >= 1.0/m_AveragedSamplesPerSecond) {
|
||||||
|
if (m_CurrentAveragedSampleIndex < m_AveragedSampleSize) {
|
||||||
|
m_AveragedSamples.push_back(1.0/average);
|
||||||
|
} else {
|
||||||
|
m_AveragedSamples[m_CurrentAveragedSampleIndex % m_AveragedSampleSize] = 1.0/average;
|
||||||
|
}
|
||||||
|
m_CurrentAveragedSampleIndex++;
|
||||||
|
m_TimeAccumulator = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
float maxFPS = 0.f;
|
||||||
|
ImVector<float> values;
|
||||||
|
int values_offset = m_CurrentAveragedSampleIndex % m_AveragedSampleSize;
|
||||||
|
for (double d : m_AveragedSamples) {
|
||||||
|
values.push_back(static_cast<float>(d));
|
||||||
|
maxFPS = std::max(maxFPS, static_cast<float>(d));
|
||||||
|
}
|
||||||
|
std::stringstream header;
|
||||||
|
header << std::round(1.0/average) << " FPS (" << std::setprecision(5) << average << " ms)";
|
||||||
|
ImGui::PlotLines("##FPSGraph", values.Data, values.Size, values_offset, header.str().c_str(), 0.f, maxFPS + maxFPS/5.f, ImVec2(0, 100));
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorStats::drawRAMUsage(double dt)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
PROCESS_MEMORY_COUNTERS_EX ppm;
|
||||||
|
GetProcessMemoryInfo(GetCurrentProcess(), (PPROCESS_MEMORY_COUNTERS)&ppm, sizeof(ppm));
|
||||||
|
float megabytes = ppm.WorkingSetSize / (float)std::pow(1024, 2);
|
||||||
|
ImGui::Text("Memory: ~%f MiB", megabytes);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditorStats::drawVRAMStats(double dt)
|
||||||
|
{
|
||||||
|
//const unsigned int GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX = 0x9049;
|
||||||
|
//const unsigned int GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX = 0x9048;
|
||||||
|
//glm::ivec4 total;
|
||||||
|
//glGetIntegerv(GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX, glm::value_ptr(total));
|
||||||
|
//if (glGetError() == GL_NO_ERROR) {
|
||||||
|
// glm::ivec4 available;
|
||||||
|
// glGetIntegerv(GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, glm::value_ptr(available));
|
||||||
|
// float megabytes = (total.x - available.x) / 1024.f; // NVidia returns in KiB
|
||||||
|
// ImGui::Text("VRAM: %f", megabytes);
|
||||||
|
//}
|
||||||
|
|
||||||
|
//GLuint uNoOfGPUs = wglGetGPUIDsAMD(0, 0);
|
||||||
|
//if (!GLERROR("")) {
|
||||||
|
// GLuint* uGPUIDs = new GLuint[uNoOfGPUs];
|
||||||
|
// wglGetGPUIDsAMD(uNoOfGPUs, uGPUIDs);
|
||||||
|
// GLuint uTotalMemoryInMB = 0;
|
||||||
|
// wglGetGPUInfoAMD(uGPUIDs[0],
|
||||||
|
// WGL_GPU_RAM_AMD,
|
||||||
|
// GL_UNSIGNED_INT,
|
||||||
|
// sizeof(GLuint),
|
||||||
|
// &uTotalMemoryInMB);
|
||||||
|
// GLint nCurAvailMemoryInKB[4];
|
||||||
|
// glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI,
|
||||||
|
// &nCurAvailMemoryInKB[0]);
|
||||||
|
// float usedTexture = (nCurAvailMemoryInKB[0] / 1024.f);
|
||||||
|
// glGetIntegerv(GL_VBO_FREE_MEMORY_ATI,
|
||||||
|
// &nCurAvailMemoryInKB[0]);
|
||||||
|
// float usedVBO = (nCurAvailMemoryInKB[0] / 1024.f);
|
||||||
|
// glGetIntegerv(GL_RENDERBUFFER_FREE_MEMORY_ATI,
|
||||||
|
// &nCurAvailMemoryInKB[0]);
|
||||||
|
// float usedFB = (nCurAvailMemoryInKB[0] / 1024.f);
|
||||||
|
// ImGui::Text("VRAM: %f MiB ", (float)uTotalMemoryInMB - usedTexture - usedVBO - usedFB);
|
||||||
|
// ImGui::Text(" Texture: %f MiB", usedTexture);
|
||||||
|
// ImGui::Text(" VBO: %f MiB", usedVBO);
|
||||||
|
// ImGui::Text(" Framebuffer: %f MiB", usedFB);
|
||||||
|
// delete[] uGPUIDs;
|
||||||
|
//}
|
||||||
|
}
|
||||||
@@ -27,6 +27,8 @@ EditorSystem::EditorSystem(EventBroker* eventBroker, IRenderer* renderer, Render
|
|||||||
m_EditorGUI = new EditorGUI(m_EventBroker);
|
m_EditorGUI = new EditorGUI(m_EventBroker);
|
||||||
m_EditorGUI->SetEntitySelectedCallback(std::bind(&EditorSystem::OnEntitySelected, this, std::placeholders::_1));
|
m_EditorGUI->SetEntitySelectedCallback(std::bind(&EditorSystem::OnEntitySelected, this, std::placeholders::_1));
|
||||||
|
|
||||||
|
m_EditorStats = new EditorStats();
|
||||||
|
|
||||||
Events::SetCamera e;
|
Events::SetCamera e;
|
||||||
e.CameraEntity = m_Camera;
|
e.CameraEntity = m_Camera;
|
||||||
m_EventBroker->Publish(e);
|
m_EventBroker->Publish(e);
|
||||||
@@ -34,6 +36,7 @@ EditorSystem::EditorSystem(EventBroker* eventBroker, IRenderer* renderer, Render
|
|||||||
|
|
||||||
EditorSystem::~EditorSystem()
|
EditorSystem::~EditorSystem()
|
||||||
{
|
{
|
||||||
|
delete m_EditorStats;
|
||||||
delete m_EditorGUI;
|
delete m_EditorGUI;
|
||||||
delete m_DebugCameraInputController;
|
delete m_DebugCameraInputController;
|
||||||
delete m_EditorWorldSystemPipeline;
|
delete m_EditorWorldSystemPipeline;
|
||||||
@@ -45,6 +48,7 @@ void EditorSystem::Update(World* world, double dt)
|
|||||||
m_EditorWorldSystemPipeline->Update(m_EditorWorld, dt);
|
m_EditorWorldSystemPipeline->Update(m_EditorWorld, dt);
|
||||||
|
|
||||||
m_EditorGUI->Draw(world);
|
m_EditorGUI->Draw(world);
|
||||||
|
m_EditorStats->Draw(dt);
|
||||||
|
|
||||||
m_DebugCameraInputController->Update(dt);
|
m_DebugCameraInputController->Update(dt);
|
||||||
m_Camera["Transform"]["Position"] = m_DebugCameraInputController->Position();
|
m_Camera["Transform"]["Position"] = m_DebugCameraInputController->Position();
|
||||||
|
|||||||
Reference in New Issue
Block a user