uxn

Varvara Ordinator, written in ANSI C(SDL2)
git clone https://git.eamoncaddigan.net/uxn.git
Log | Files | Refs | README | LICENSE

commit 156ef01226c069ad5930c2655a10f22380a387a8
parent 87465a40baf315e32213fbd100fee20d7d97c371
Author: John Yates <jyates65@gmail.com>
Date:   Wed, 12 Nov 2025 13:43:36 -0500

fix framerate delay calculation to account for screen vector execution time

Diffstat:
Msrc/uxnemu.c | 21++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/uxnemu.c b/src/uxnemu.c @@ -42,7 +42,6 @@ WITH REGARD TO THIS SOFTWARE. #define WIDTH 64 * 8 #define HEIGHT 40 * 8 -#define TIMEOUT_MS 334 Uxn uxn; int console_vector; @@ -58,7 +57,6 @@ static SDL_Thread *stdin_thread; static int window_created, fullscreen, borderless; static Uint32 stdin_event, audio0_event, zoom = 1; -static Uint64 exec_deadline, deadline_interval, ms_interval; static Uint8 audio_dei(int instance, Uint8 *d, Uint8 port) @@ -269,9 +267,6 @@ emu_init(void) SDL_ShowCursor(SDL_DISABLE); SDL_EventState(SDL_DROPFILE, SDL_ENABLE); SDL_SetRenderDrawColor(emu_renderer, 0x00, 0x00, 0x00, 0xff); - ms_interval = SDL_GetPerformanceFrequency() / 1000; - deadline_interval = ms_interval * TIMEOUT_MS; - exec_deadline = SDL_GetPerformanceCounter() + deadline_interval; screen_resize(WIDTH, HEIGHT, 1); return 1; } @@ -421,10 +416,12 @@ static int emu_run(void) { Uint64 next_refresh = 0; - Uint64 frame_interval = SDL_GetPerformanceFrequency() / 60; + Uint64 perf_freq = SDL_GetPerformanceFrequency(); + Uint64 frame_interval = perf_freq / 60; + Uint64 ms_interval = perf_freq / 1000; Uint32 window_flags = SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI; char *rom_name = metadata_read_name(); - window_created = 1; + window_created = 0; if(fullscreen) window_flags = window_flags | SDL_WINDOW_FULLSCREEN_DESKTOP; emu_window = SDL_CreateWindow(rom_name, @@ -435,6 +432,7 @@ emu_run(void) window_flags); if(emu_window == NULL) return system_error("sdl_window", SDL_GetError()); + window_created = 1; emu_renderer = SDL_CreateRenderer(emu_window, -1, SDL_RENDERER_ACCELERATED); if(emu_renderer == NULL) return system_error("sdl_renderer", SDL_GetError()); @@ -445,19 +443,20 @@ emu_run(void) /* .System/halt */ if(uxn.dev[0x0f]) return system_error("Run", "Ended."); - exec_deadline = now + deadline_interval; if(!handle_events()) return 0; if(now >= next_refresh) { - now = SDL_GetPerformanceCounter(); next_refresh = now + frame_interval; uxn_eval(uxn_screen.vector); if(uxn_screen.x2 && uxn_screen.y2 && screen_changed()) screen_redraw(), emu_redraw(); } if(uxn_screen.vector) { - Uint64 delay_ms = (next_refresh - now) / ms_interval; - if(delay_ms > 0) SDL_Delay(delay_ms); + now = SDL_GetPerformanceCounter(); + if(now < next_refresh) { + Uint64 delay_ms = (next_refresh - now) / ms_interval; + if (delay_ms > 0) SDL_Delay(delay_ms); + } } else SDL_WaitEvent(NULL); }