From dcbe0949a218df0dae8e3cdc85f62a2236cbeae7 Mon Sep 17 00:00:00 2001
From: Serge Bazanski <q3k@q3k.org>
Date: Sun, 4 Jun 2023 15:26:01 +0200
Subject: [PATCH] demo_worms: add primitive frame limiter

---
 python_payload/demo_worms.py | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/python_payload/demo_worms.py b/python_payload/demo_worms.py
index 87a11a5989..066b66897e 100644
--- a/python_payload/demo_worms.py
+++ b/python_payload/demo_worms.py
@@ -85,13 +85,37 @@ def init():
         worms.append(Worm())
     ctx = hardware.get_ctx()
 
+# TODO(q3k): factor out frame limiter
+last_render = None
+target_fps = 30
+target_delta = 1000 / target_fps
+frame_slack = None
+last_report = None
 def run():
+    global last_render
+    global last_report
+    global frame_slack
+    now = time.ticks_ms()
+
+    if last_render is not None:
+        delta = now - last_render
+        if frame_slack is None:
+            frame_slack = target_delta - delta
+        if delta < target_delta:
+            return
+
+        if last_report is None or (now - last_report) > 1000:
+            fps = 1000/delta
+            print(f'fps: {fps:.3}, frame budget slack: {frame_slack:.3}ms')
+            last_report = now
+
+    # Simulation is currently locked to FPS.
     global worms
     for w in worms:
         w.draw()
         w.move()
     hardware.display_update()
-    time.sleep(0.001)
+    last_render = now
 
 
 def foreground():
-- 
GitLab