From 028ac3ebb67db7032c1df7de3f1112e05aa83ace Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 8 Jun 2025 21:59:56 -0400 Subject: [PATCH] frametime reporting work --- docs/src/progress/renderertodo.md | 1 + .../client/ui/menu/debug/ImGuiWindowMacros.java | 4 +--- src/main/java/electrosphere/engine/Main.java | 14 ++++++++++++++ .../java/electrosphere/engine/time/Timekeeper.java | 2 +- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index c2af062d..776bdd38 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -2139,6 +2139,7 @@ Undo getPosition new alloc to lower memory footprint Work to reduce allocations Prevent mouse event re-allocation every frame More allocation work +Frametime reporting work diff --git a/src/main/java/electrosphere/client/ui/menu/debug/ImGuiWindowMacros.java b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiWindowMacros.java index 7a796645..890751b0 100644 --- a/src/main/java/electrosphere/client/ui/menu/debug/ImGuiWindowMacros.java +++ b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiWindowMacros.java @@ -80,12 +80,10 @@ public class ImGuiWindowMacros { globalFrametimePlot = new ImGuiLinePlot("Frametime plot"); globalFrametimeDatasets = new HashMap(); ImGuiWindowMacros.initFramerateGraphSeries("totalframerate"); - ImGuiWindowMacros.initFramerateGraphSeries("serversim"); - ImGuiWindowMacros.initFramerateGraphSeries("clientsim"); + ImGuiWindowMacros.initFramerateGraphSeries("simframes"); ImGuiWindowMacros.initFramerateGraphSeries("render"); ImGuiWindowMacros.initFramerateGraphSeries("assetLoad"); ImGuiWindowMacros.initFramerateGraphSeries("clientNetwork"); - ImGuiWindowMacros.initFramerateGraphSeries("controls"); globalFrametimeWindow.addElement(globalFrametimePlot); globalFrametimeWindow.setOpen(false); Globals.renderingEngine.getImGuiPipeline().addImGuiWindow(globalFrametimeWindow); diff --git a/src/main/java/electrosphere/engine/Main.java b/src/main/java/electrosphere/engine/Main.java index 14a7fb06..057ef66f 100644 --- a/src/main/java/electrosphere/engine/Main.java +++ b/src/main/java/electrosphere/engine/Main.java @@ -205,6 +205,8 @@ public class Main { //resets running flag to that we can repeatedly loop (ie in tests) running = true; + double startTime, endTime; + //main loop while (running) { //enable profiler control @@ -229,12 +231,15 @@ public class Main { /// A S S E T M A N A G E R S T U F F /// if(EngineState.EngineFlags.RUN_CLIENT){ + startTime = Globals.engineState.timekeeper.getTime(); Globals.profiler.beginCpuSample("Load Assets"); LoggerInterface.loggerEngine.DEBUG_LOOP("Begin load assets"); Globals.assetManager.loadAssetsInQueue(); LoggerInterface.loggerEngine.DEBUG_LOOP("Begin delete assets"); Globals.assetManager.handleDeleteQueue(); Globals.profiler.endCpuSample(); + endTime = Globals.engineState.timekeeper.getTime(); + ImGuiWindowMacros.addGlobalFramerateDatapoint("assetLoad", endTime - startTime); } @@ -245,10 +250,13 @@ public class Main { /// //Why is this its own function? Just to get the networking code out of main() if(Globals.clientState.clientConnection != null){ + startTime = Globals.engineState.timekeeper.getTime(); Globals.profiler.beginCpuSample("Client networking"); LoggerInterface.loggerEngine.DEBUG_LOOP("Begin parse client messages"); Globals.clientState.clientConnection.parseMessagesSynchronous(); Globals.profiler.endCpuSample(); + endTime = Globals.engineState.timekeeper.getTime(); + ImGuiWindowMacros.addGlobalFramerateDatapoint("clientNetwork", endTime - startTime); } @@ -288,6 +296,7 @@ public class Main { /// int simFrameHardcapCounter = 0; + startTime = Globals.engineState.timekeeper.getTime(); while(Globals.engineState.timekeeper.pullFromAccumulator() && framestep > 0 && simFrameHardcapCounter < Timekeeper.SIM_FRAME_HARDCAP){ //do not simulate extra frames if we're already behind schedule @@ -331,6 +340,8 @@ public class Main { MainServerFunctions.simulate(); Globals.profiler.endCpuSample(); } + endTime = Globals.engineState.timekeeper.getTime(); + ImGuiWindowMacros.addGlobalFramerateDatapoint("simframes", endTime - startTime); @@ -351,9 +362,12 @@ public class Main { /// LoggerInterface.loggerEngine.DEBUG_LOOP("Begin rendering call"); if(EngineState.EngineFlags.RUN_CLIENT && !EngineState.EngineFlags.HEADLESS){ + startTime = Globals.engineState.timekeeper.getTime(); Globals.profiler.beginCpuSample("render"); Globals.renderingEngine.drawScreen(); Globals.profiler.endCpuSample(); + endTime = Globals.engineState.timekeeper.getTime(); + ImGuiWindowMacros.addGlobalFramerateDatapoint("render", endTime - startTime); } diff --git a/src/main/java/electrosphere/engine/time/Timekeeper.java b/src/main/java/electrosphere/engine/time/Timekeeper.java index 1e11ca9d..f81d89b9 100644 --- a/src/main/java/electrosphere/engine/time/Timekeeper.java +++ b/src/main/java/electrosphere/engine/time/Timekeeper.java @@ -66,7 +66,7 @@ public class Timekeeper { * Gets the time since the engine started from the system * @return The time (in seconds) */ - private double getTime(){ + public double getTime(){ if(EngineState.EngineFlags.HEADLESS){ return System.currentTimeMillis() - engineStartTime; } else {