diff --git a/src/d_main.c b/src/d_main.c
index 629c8ee18c286bb099a1e31b9d7e955c30d207c6..a08ed77d35e167aad61520c645d3103a5ab906c1 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -799,7 +799,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));
 			}