diff --git a/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java b/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java
index 4a527723e38deed94092c2a1fac69babdeb39685..792980a5f4e4239178906374284a8833fef67b49 100644
--- a/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java
+++ b/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java
@@ -328,6 +328,10 @@ public class MultiResolutionRenderer
 	 */
 	public synchronized void requestRepaint( final Interval interval )
 	{
+		// if interval doesn't overlap the screen, do nothing
+		if ( Intervals.isEmpty( screenScales.clipToScreen( interval ) ) )
+			return;
+
 		if ( !intervalMode && !renderingMayBeCancelled )
 		{
 			/*
diff --git a/src/main/java/bdv/viewer/render/ScreenScales.java b/src/main/java/bdv/viewer/render/ScreenScales.java
index 177d5c843097ea5d94ae6089b9e25c3b70a158f0..eb19226070a885aea25b33fb79215da1e64ef27b 100644
--- a/src/main/java/bdv/viewer/render/ScreenScales.java
+++ b/src/main/java/bdv/viewer/render/ScreenScales.java
@@ -129,6 +129,25 @@ class ScreenScales
 		return screenScales.size() - 1;
 	}
 
+	/**
+	 * Compute the intersection of {@code interval} and the screen area.
+	 *
+	 * @param interval
+	 * 		a 2D interval in screen coordinates
+	 *
+	 * @return intersection of {@code interval} and the screen area
+	 */
+	public Interval clipToScreen( final Interval interval )
+	{
+		// This is equivalent to
+		// Intervals.intersect( interval, new FinalInterval( screenW, screenH ) );
+		return Intervals.createMinMax(
+				Math.max( 0, interval.min( 0 ) ),
+				Math.max( 0, interval.min( 1 ) ),
+				Math.min( screenW - 1, interval.max( 0 ) ),
+				Math.min( screenH - 1, interval.max( 1 ) ) );
+	}
+
 	public void requestInterval( final Interval screenInterval )
 	{
 		screenScales.forEach( s -> s.requestInterval( screenInterval ) );