diff --git a/assets/sports/ncaa_logos/COR.png b/assets/sports/ncaa_logos/COR.png new file mode 100644 index 00000000..d39027fa Binary files /dev/null and b/assets/sports/ncaa_logos/COR.png differ diff --git a/src/vegas_mode/coordinator.py b/src/vegas_mode/coordinator.py index 92980ef3..ecd59529 100644 --- a/src/vegas_mode/coordinator.py +++ b/src/vegas_mode/coordinator.py @@ -406,7 +406,11 @@ class VegasModeCoordinator: fps_log_interval = 5.0 # Sample FPS every 5 seconds last_fps_health_log = 0.0 # last INFO-level report was_degraded = False # so the recovery is reported too - last_fps_log_time = start_time + # Monotonic, and deliberately not start_time: start_time is wall + # clock and is used below to report the iteration's duration. Mixing + # the two here would make every delta hugely negative and silence the + # frame-rate reporting altogether. + last_fps_log_time = time.monotonic() fps_frame_count = 0 # A mean hides stutter completely. At 120fps a five-second window is # ~600 frames, so a 200ms freeze -- plainly visible on a marquee -- @@ -467,7 +471,12 @@ class VegasModeCoordinator: # of them within 10% of target. The 1.5% that were not included a # reading of 8.6fps against a target of 60 -- a real stall, and # completely invisible inside 1389 lines reading "59.6". - current_time = time.time() + # Monotonic: every use of this value in the block below is a + # duration, and these devices have no RTC, so the wall clock jumps + # by however wrong boot time was the moment NTP first syncs. That + # would not only mis-fire the heartbeat, it would corrupt the + # frame rate itself, since fps is frames divided by this delta. + current_time = time.monotonic() if current_time - last_fps_log_time >= fps_log_interval: fps = fps_frame_count / (current_time - last_fps_log_time) p99 = _percentile(sorted(frame_times), 0.99)