Skip to content
Snippets Groups Projects
Commit 82bfdecc authored by pippin's avatar pippin
Browse files

py,st3m-ui: hold overlays mutex for shorter intervals

For fps overlay only show every 5th frame, for the regular overlay
first collect list of active overlays, and only if there is overlays
active get and flush the overlay ctx.

Also clearing a smaller rectangle with default overlays - the fps code
which does a lot less work is more reliable for use with mpremote.
parent 32b420c3
No related branches found
No related tags found
No related merge requests found
...@@ -66,6 +66,8 @@ class Compositor(Responder): ...@@ -66,6 +66,8 @@ class Compositor(Responder):
OverlayKind.Debug: True, OverlayKind.Debug: True,
OverlayKind.Toast: True, OverlayKind.Toast: True,
} }
self._last_fps_string = ""
self._frame_skip = 0
def _enabled_overlays(self) -> List[Responder]: def _enabled_overlays(self) -> List[Responder]:
res: List[Responder] = [] res: List[Responder] = []
...@@ -93,8 +95,11 @@ class Compositor(Responder): ...@@ -93,8 +95,11 @@ class Compositor(Responder):
self.main.draw(ctx) self.main.draw(ctx)
if (sys_display.get_mode() & sys_display.osd) == 0: if (sys_display.get_mode() & sys_display.osd) == 0:
return return
octx = sys_display.ctx(sys_display.osd)
if settings.onoff_show_fps.value: if settings.onoff_show_fps.value:
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_x0 = 0
_clip_y1 = 0 _clip_y1 = 0
_clip_x1 = 240 _clip_x1 = 240
...@@ -106,7 +111,7 @@ class Compositor(Responder): ...@@ -106,7 +111,7 @@ class Compositor(Responder):
_clip_x0 - 120, _clip_x0 - 120,
_clip_y0 - 120, _clip_y0 - 120,
_clip_x1 - _clip_x0 + 1, _clip_x1 - _clip_x0 + 1,
_clip_y1 - _clip_y0 + 1, _clip_y1 - _clip_y0 + 2,
).fill() ).fill()
octx.restore() octx.restore()
octx.gray(1) octx.gray(1)
...@@ -114,20 +119,35 @@ class Compositor(Responder): ...@@ -114,20 +119,35 @@ class Compositor(Responder):
octx.font = "Bold" octx.font = "Bold"
octx.move_to(0, -103) octx.move_to(0, -103)
octx.text_align = octx.CENTER octx.text_align = octx.CENTER
octx.text("{0:.1f}".format(sys_display.fps())) 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: else:
if self._frame_skip <= 0:
overlays = self._enabled_overlays()
_clip_x0 = 80 _clip_x0 = 80
_clip_y0 = 0 _clip_y0 = 0
_clip_x1 = 160 _clip_x1 = 160
_clip_y1 = 0 _clip_y1 = 0
octx = sys_display.ctx(sys_display.osd)
octx.save() octx.save()
octx.compositing_mode = octx.CLEAR 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.rectangle(-120, -120, 240, 240).fill()
octx.restore() octx.restore()
for overlay in self._enabled_overlays(): for overlay in overlays:
overlay.draw(octx) overlay.draw(octx)
sys_display.overlay_clip(_clip_x0, _clip_y0, _clip_x1, _clip_y1)
sys_display.update(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: def add_overlay(self, ov: Overlay) -> None:
""" """
...@@ -316,7 +336,7 @@ class OverlayVolume(Overlay): ...@@ -316,7 +336,7 @@ class OverlayVolume(Overlay):
if self._showing is None: if self._showing is None:
return return
self._showing -= delta_ms self._showing -= delta_ms / 2
if self._showing < 0: if self._showing < 0:
self._showing = None self._showing = None
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment