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