diff --git a/engine/engine.c b/engine/engine.c index b9c7395..4f3a4f5 100644 --- a/engine/engine.c +++ b/engine/engine.c @@ -13,6 +13,14 @@ #define FRAMERATE 60 #define INTERVAL (1000 / FRAMERATE) +#define VT100_CURSORTOPLEFT "\33[H" +#define VT100_CLEAR "\33[2J" + +typedef struct { + double freq; + uint64_t start, evt, update, render; +} perf_t; + int main(int argc, char *argv[]) { int err = SDL_Init(SDL_INIT_VIDEO); @@ -29,33 +37,54 @@ int main(int argc, char *argv[]) void *gamemem = calloc(1, game_conf.memsize); game_init(argc, argv, gamemem, renderer); - uint64_t prevt = SDL_GetTicks64(); + perf_t perf = { .freq = SDL_GetPerformanceFrequency() / 1000000.0 }; + uint64_t frame = 0, prevt = SDL_GetTicks64(); while (1) { - uint64_t t = SDL_GetTicks64(); - uint64_t dt = t - prevt; - + const uint64_t t = SDL_GetTicks64(); + const uint64_t dt = t - prevt; if (dt >= INTERVAL) { + perf.start = SDL_GetPerformanceCounter(); + // Handle all events currently in queue SDL_Event evt; while (SDL_PollEvent(&evt)) { if (game_evthandle(gamemem, &evt) != GAMESTATUS_OK) goto quit; } + perf.evt = SDL_GetPerformanceCounter(); // Update game state - if (game_update(gamemem, dt) != GAMESTATUS_OK) + if (game_update(gamemem, INTERVAL) != GAMESTATUS_OK) goto quit; + perf.update = SDL_GetPerformanceCounter(); // Render frame SDL_RenderClear(renderer); game_render(gamemem, renderer, t); SDL_RenderPresent(renderer); + perf.render = SDL_GetPerformanceCounter(); - // Set previous frame draw time + // Print performance if frame counter divisible by 8 + if ((frame & 7) == 0) { + const double evt = (perf.evt - perf.start) / perf.freq; + const double update = (perf.update - perf.evt) / perf.freq; + const double render + = (perf.render - perf.update) / perf.freq; + const double total = (perf.render - perf.start) / perf.freq; + const double total_pc = (100 * total / (1000 * INTERVAL)); + printf( + VT100_CLEAR VT100_CURSORTOPLEFT + "evt\t%10.3f μs\nupdate\t%10.3f μs\nrender\t" + "%10.3f μs\ntotal\t%10.3f μs (%05.2f%%)\n", + evt, update, render, total, total_pc); + } + + // Increment frame counter and update time + ++frame; prevt = t; } - SDL_Delay(2); + SDL_Delay(INTERVAL / 8); } quit: