diff --git a/src/d_main.c b/src/d_main.c
index eb01edd9d8347ffdd8cf8674338f346acbd3d122..6912ec98824f0be85c50d0a3913c4ec057cc1864 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -892,15 +892,10 @@ void D_SRB2Loop(void)
 		LUA_Step();
 
 		// Fully completed frame made.
-		if (!singletics && !dedicated)
+		if (!singletics)
 		{
 			I_FrameCapSleep(frameEnd);
 		}
-		else if (dedicated)
-		{
-			// Preserve the pre-interp sleeping behavior for dedicated mode
-			I_Sleep();
-		}
 
 		// I_FinishUpdate is now here instead of D_Display,
 		// because it synchronizes it more closely with the frame counter.
diff --git a/src/r_fps.c b/src/r_fps.c
index 1bc92c6227f1efcb1097043000495ca5f33e462e..45f301551a441c883d43748e874d793135ce0181 100644
--- a/src/r_fps.c
+++ b/src/r_fps.c
@@ -42,6 +42,13 @@ consvar_t cv_fpscap = CVAR_INIT ("fpscap", "Match refresh rate", CV_SAVE, fpscap
 
 UINT32 R_GetFramerateCap(void)
 {
+	if (rendermode == render_none)
+	{
+		// If we're not rendering (dedicated server),
+		// we shouldn't be using any interpolation.
+		return TICRATE;
+	}
+
 	if (cv_fpscap.value == 0)
 	{
 		// 0: Match refresh rate