diff --git a/python_payload/st3m/ui/elements/overlays.py b/python_payload/st3m/ui/elements/overlays.py
index 82d8e8b4936f6f94a1c1f8464d689b0fe71f32ed..d582e8736da5ade734740a4598474c5f5a7b38a3 100644
--- a/python_payload/st3m/ui/elements/overlays.py
+++ b/python_payload/st3m/ui/elements/overlays.py
@@ -66,6 +66,8 @@ class Compositor(Responder):
             OverlayKind.Debug: True,
             OverlayKind.Toast: True,
         }
+        self._last_fps_string = ""
+        self._frame_skip = 0
 
     def _enabled_overlays(self) -> List[Responder]:
         res: List[Responder] = []
@@ -93,41 +95,59 @@ class Compositor(Responder):
         self.main.draw(ctx)
         if (sys_display.get_mode() & sys_display.osd) == 0:
             return
-        octx = sys_display.ctx(sys_display.osd)
         if settings.onoff_show_fps.value:
-            _clip_x0 = 0
-            _clip_y1 = 0
-            _clip_x1 = 240
-            _clip_y1 = 24
-            octx.save()
-            octx.rgba(0, 0, 0, 0.5)
-            octx.compositing_mode = octx.COPY
-            octx.rectangle(
-                _clip_x0 - 120,
-                _clip_y0 - 120,
-                _clip_x1 - _clip_x0 + 1,
-                _clip_y1 - _clip_y0 + 1,
-            ).fill()
-            octx.restore()
-            octx.gray(1)
-            octx.font_size = 18
-            octx.font = "Bold"
-            octx.move_to(0, -103)
-            octx.text_align = octx.CENTER
-            octx.text("{0:.1f}".format(sys_display.fps()))
+            fps_string = "{0:.1f}".format(sys_display.fps())
+            if fps_string != self._last_fps_string and self._frame_skip <= 0:
+                octx = sys_display.ctx(sys_display.osd)
+                self._last_fps_string = fps_string
+                _clip_x0 = 0
+                _clip_y1 = 0
+                _clip_x1 = 240
+                _clip_y1 = 24
+                octx.save()
+                octx.rgba(0, 0, 0, 0.5)
+                octx.compositing_mode = octx.COPY
+                octx.rectangle(
+                    _clip_x0 - 120,
+                    _clip_y0 - 120,
+                    _clip_x1 - _clip_x0 + 1,
+                    _clip_y1 - _clip_y0 + 2,
+                ).fill()
+                octx.restore()
+                octx.gray(1)
+                octx.font_size = 18
+                octx.font = "Bold"
+                octx.move_to(0, -103)
+                octx.text_align = octx.CENTER
+                octx.text(fps_string)
+                self._frame_skip = 5
+                sys_display.update(octx)
+                sys_display.overlay_clip(_clip_x0, _clip_y0, _clip_x1, _clip_y1)
+            else:
+                self._frame_skip -= 1
         else:
-            _clip_x0 = 80
-            _clip_y0 = 0
-            _clip_x1 = 160
-            _clip_y1 = 0
-            octx.save()
-            octx.compositing_mode = octx.CLEAR
-            octx.rectangle(-120, -120, 240, 240).fill()
-            octx.restore()
-            for overlay in self._enabled_overlays():
-                overlay.draw(octx)
-        sys_display.overlay_clip(_clip_x0, _clip_y0, _clip_x1, _clip_y1)
-        sys_display.update(octx)
+            if self._frame_skip <= 0:
+                overlays = self._enabled_overlays()
+                _clip_x0 = 80
+                _clip_y0 = 0
+                _clip_x1 = 160
+                _clip_y1 = 0
+
+                octx = sys_display.ctx(sys_display.osd)
+                octx.save()
+                octx.compositing_mode = octx.CLEAR
+                if len(overlays) == 1:
+                    octx.rectangle(-50, -120, 100, 150).fill()
+                else:
+                    octx.rectangle(-120, -120, 240, 240).fill()
+                octx.restore()
+                for overlay in overlays:
+                    overlay.draw(octx)
+                sys_display.update(octx)
+                sys_display.overlay_clip(_clip_x0, _clip_y0, _clip_x1, _clip_y1)
+                self._frame_skip = 2
+            else:
+                self._frame_skip -= 1
 
     def add_overlay(self, ov: Overlay) -> None:
         """
@@ -316,7 +336,7 @@ class OverlayVolume(Overlay):
 
         if self._showing is None:
             return
-        self._showing -= delta_ms
+        self._showing -= delta_ms / 2
         if self._showing < 0:
             self._showing = None