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:
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);
}