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;