From 3952d93bb08323e8473d50d2a6b7cd9299f9d97e Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Thu, 2 Jan 2025 17:10:00 +0000 Subject: [PATCH] Add CMake option to enable/disable performance monitoring --- CMakeLists.txt | 1 + engine/CMakeLists.txt | 3 +++ engine/engine.c | 22 ++++++++++++++++------ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ab86ab..72027c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ project(epec-mcu-emulator LANGUAGES C) option(WERROR "Treat warnings as errors" OFF) option(SANITIZERS "Enable memory and undefined behaviour sanitizers" OFF) +option(PERFMON "Monitor performance of game code" ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index dc63058..7248276 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -1,3 +1,6 @@ add_library(engine engine.c) set_default_target_options(engine) target_include_directories(engine PUBLIC include) +if(${PERFMON}) + target_compile_definitions(engine PRIVATE PERFMON) +endif() diff --git a/engine/engine.c b/engine/engine.c index d111910..adf86f9 100644 --- a/engine/engine.c +++ b/engine/engine.c @@ -13,6 +13,12 @@ #define VT100_CURSORTOPLEFT "\33[H" #define VT100_CLEAR "\33[2J" +#ifdef PERFMON +#define GETPERF(x) x = SDL_GetPerformanceCounter() +#else +#define GETPERF(x) +#endif + typedef struct { double freq; uint64_t start, evt, update, render; @@ -39,10 +45,12 @@ int main(int argc, char *argv[]) void *gamemem = calloc(1, game_conf.memsize); game_init(argc, argv, gamemem, renderer); +#ifdef PERFMON perf_t perf = { .freq = SDL_GetPerformanceFrequency() / 1000000.0 }; uint64_t frame = 0; +#endif while (1) { - perf.start = SDL_GetPerformanceCounter(); + GETPERF(perf.start); // Handle all events currently in queue SDL_Event evt; @@ -50,18 +58,19 @@ int main(int argc, char *argv[]) if (game_evthandle(gamemem, &evt) != GAMESTATUS_OK) goto quit; } - perf.evt = SDL_GetPerformanceCounter(); + GETPERF(perf.evt); // Update game state if (game_update(gamemem, interval) != GAMESTATUS_OK) goto quit; - perf.update = SDL_GetPerformanceCounter(); + GETPERF(perf.update); // Render frame SDL_RenderClear(renderer); game_render(gamemem, renderer, SDL_GetTicks64()); - perf.render = SDL_GetPerformanceCounter(); + GETPERF(perf.render); +#ifdef PERFMON // Print performance analysis every 16 frames if ((frame & 15) == 0) { const double evt = (perf.evt - perf.start) / perf.freq; @@ -75,9 +84,10 @@ int main(int argc, char *argv[]) "%10.3f μs\ntotal\t%10.3f μs (%05.2f%%)\n", evt, update, render, total, total_pc); } - - // Increment frame counter and present frame ++frame; +#endif + + // Present frame SDL_RenderPresent(renderer); }