mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-10 17:16:36 +00:00
feat(vegas): prefetch_gate on by default, after an A/B/C soak on hdpi
Two runs per arm, about 81,000 frames each, order A B C C B A: A step 1 as is 0.90% late, 20.1 per 10k two+ refreshes late B switch_interval_ms 1 0.78% late, 15.8 per 10k C prefetch_gate 0.60% late, 2.5 per 10k No freezes in any arm, and the next group was ready at every strip extension, so parking the prefetch thread (3-6s per 8-minute run) cost nothing visible. The gate is now on unless vegas_scroll.prefetch_gate is false; on a stock binding it cannot work and says so at INFO once a run rather than warning on every install. switch_interval_ms stays off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -87,16 +87,17 @@ class VegasModeConfig:
|
||||
# 5ms. Plugin rendering on the prefetch thread and plugin updates hold the
|
||||
# GIL in Pillow and Python code, and a frame waiting its turn for 5ms at a
|
||||
# time misses its refresh. 0 leaves the interpreter default alone.
|
||||
# Experimental: measured with scripts/frame_soak.py before it gets a default.
|
||||
# Experimental. On hdpi it did less than prefetch_gate (0.90% -> 0.78% late
|
||||
# against 0.60%; see docs/OFFSCREEN_RENDERING.md), so it stays off.
|
||||
switch_interval_ms: float = 0.0
|
||||
|
||||
# Let the prefetch thread run Python only while the render thread is
|
||||
# blocked waiting for vsync, and park it the rest of the time, so the
|
||||
# render thread never waits for the GIL when its refresh comes round. Needs
|
||||
# a binding that releases the GIL in SwapOnVSync; ignored otherwise.
|
||||
# Experimental: see src/common/render_gate.py and measure with
|
||||
# scripts/frame_soak.py before it gets a default.
|
||||
prefetch_gate: bool = False
|
||||
# a binding that releases the GIL in SwapOnVSync; off otherwise. On hdpi
|
||||
# it cut frames two or more refreshes late eightfold, and late frames
|
||||
# overall from 0.90% to 0.60%. See src/common/render_gate.py.
|
||||
prefetch_gate: bool = True
|
||||
|
||||
# Keep one continuous strip, extending it with the next group of plugins as
|
||||
# the scroll approaches the end, instead of composing a fresh strip and
|
||||
@@ -229,7 +230,7 @@ class VegasModeConfig:
|
||||
continuous_scroll=vegas_config.get('continuous_scroll', True),
|
||||
offscreen_prefetch=bool(vegas_config.get('offscreen_prefetch', True)),
|
||||
switch_interval_ms=float(vegas_config.get('switch_interval_ms', 0.0) or 0.0),
|
||||
prefetch_gate=bool(vegas_config.get('prefetch_gate', False)),
|
||||
prefetch_gate=bool(vegas_config.get('prefetch_gate', True)),
|
||||
extend_threshold_screens=float(
|
||||
vegas_config.get('extend_threshold_screens', 2.0)),
|
||||
auto_trim=vegas_config.get('auto_trim', True),
|
||||
|
||||
@@ -340,12 +340,14 @@ class VegasModeCoordinator:
|
||||
if getattr(self.display_manager, 'render_gate', None) is not None:
|
||||
return
|
||||
releases = render_gate.swap_releases_gil()
|
||||
if releases is None:
|
||||
logger.debug("Vegas: no prefetch gate -- no hardware binding loaded")
|
||||
return
|
||||
if not releases:
|
||||
logger.warning(
|
||||
"Vegas: prefetch_gate ignored -- %s",
|
||||
"this rgbmatrix binding keeps the GIL in SwapOnVSync "
|
||||
"(scripts/build_rgbmatrix_nogil.sh)" if releases is False
|
||||
else "no hardware binding loaded")
|
||||
# On by default, so this is every stock install: say so once per
|
||||
# run, not as a warning.
|
||||
logger.info("Vegas: no prefetch gate -- this rgbmatrix binding keeps "
|
||||
"the GIL in SwapOnVSync (scripts/build_rgbmatrix_nogil.sh)")
|
||||
return
|
||||
gate = render_gate.RenderGate()
|
||||
# Locks the render thread takes too: never park the prefetch holding one.
|
||||
|
||||
Reference in New Issue
Block a user