diff --git a/src/d_main.c b/src/d_main.c
index 91a42ff140dd60277b5b70edb1f82587753354cd..3566e7f3d27d15a880a4ebea27c0b8ce1148a4c3 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -895,7 +895,11 @@ void D_SRB2Loop(void)
 		if (!singletics)
 		{
 			INT64 elapsed = (INT64)(finishprecise - enterprecise);
-			if (elapsed > 0 && (INT64)capbudget > elapsed)
+
+			// in the case of "match refresh rate" + vsync, don't sleep at all
+			const boolean vsync_with_match_refresh = cv_vidwait.value && cv_fpscap.value == 0;
+
+			if (elapsed > 0 && (INT64)capbudget > elapsed && !vsync_with_match_refresh)
 			{
 				I_SleepDuration(capbudget - (finishprecise - enterprecise));
 			}