diff --git a/src/dedicated/i_system.c b/src/dedicated/i_system.c index 23c0149ca789bcdd34bc464590b1edc67398ddbf..79cdd9bb6de5d3dedbbd515a3b42da33ea600c05 100644 --- a/src/dedicated/i_system.c +++ b/src/dedicated/i_system.c @@ -376,13 +376,22 @@ void I_SleepDuration(precise_t duration) { #if defined(__linux__) || defined(__FreeBSD__) UINT64 precision = I_GetPrecisePrecision(); - struct timespec ts = { - .tv_sec = duration / precision, - .tv_nsec = duration * 1000000000 / precision % 1000000000, - }; - int status; - do status = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts); - while (status == EINTR); + precise_t dest = I_GetPreciseTime() + duration; + precise_t slack = (precision / 5000); // 0.2 ms slack + if (duration > slack) + { + duration -= slack; + struct timespec ts = { + .tv_sec = duration / precision, + .tv_nsec = duration * 1000000000 / precision % 1000000000, + }; + int status; + do status = clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts); + while (status == EINTR); + } + + // busy-wait the rest + while (((INT64)dest - (INT64)I_GetPreciseTime()) > 0); #else UINT64 precision = I_GetPrecisePrecision(); INT32 sleepvalue = cv_sleep.value; diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index f32d97e2276f96d242aabf4ebc9d561953752b5c..f78f74d57c8041dd8f0941f998e4f8ef8ac80b2c 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2310,7 +2310,7 @@ void I_SleepDuration(precise_t duration) #if defined(__linux__) || defined(__FreeBSD__) || defined(__HAIKU__) UINT64 precision = I_GetPrecisePrecision(); precise_t dest = I_GetPreciseTime() + duration; - precise_t slack = (precision / 10000); // 0.1 ms slack + precise_t slack = (precision / 5000); // 0.2 ms slack if (duration > slack) { duration -= slack;