From b5f50dd975dd0327d8ef6c6ea95648fc5837a21e Mon Sep 17 00:00:00 2001 From: fgsfds Date: Fri, 26 Nov 2021 03:12:32 +0300 Subject: [PATCH] time whole frame instead of just the rendering part thanks to opmox for the fix --- src/pc/gfx/gfx_sdl2.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/pc/gfx/gfx_sdl2.c b/src/pc/gfx/gfx_sdl2.c index daff6864..601622d2 100644 --- a/src/pc/gfx/gfx_sdl2.c +++ b/src/pc/gfx/gfx_sdl2.c @@ -187,6 +187,7 @@ static void gfx_sdl_init(const char *window_title) { perf_freq = SDL_GetPerformanceFrequency(); frame_rate = perf_freq / FRAMERATE; + frame_time = SDL_GetPerformanceCounter(); for (size_t i = 0; i < sizeof(windows_scancode_table) / sizeof(SDL_Scancode); i++) { inverted_scancode_table[windows_scancode_table[i]] = i; @@ -287,19 +288,23 @@ static void gfx_sdl_set_keyboard_callbacks(kb_callback_t on_key_down, kb_callbac } static bool gfx_sdl_start_frame(void) { - frame_time = SDL_GetPerformanceCounter(); return true; } static inline void sync_framerate_with_timer(void) { // calculate how long it took for the frame to render - const double frame_length = SDL_GetPerformanceCounter() - frame_time; + const double now = SDL_GetPerformanceCounter(); + const double frame_length = now - frame_time; if (frame_length < frame_rate) { // Only sleep if we have time to spare const double remain = frame_rate - frame_length; // Sleep remaining time away sys_sleep(remain / perf_freq * 1000000.0); + // Assume we slept the required amount of time to keep the timer stable + frame_time = now + remain; + } else { + frame_time = now; } }