feat: add partial update support with caller-declared dirty tracking
- Add PartialUpdate dataclass and supports_partial_updates to EffectPlugin - Add dirty region tracking to Canvas (mark_dirty, get_dirty_rows, etc.) - Canvas auto-marks dirty on put_region, put_text, fill - CanvasStage exposes dirty rows via pipeline context - EffectChain creates PartialUpdate and calls process_partial() for optimized effects - HudEffect implements process_partial() to skip processing when rows 0-2 not dirty - This enables effects to skip work when canvas regions haven't changed
This commit is contained in:
@@ -2,7 +2,7 @@ import time
|
||||
|
||||
from engine.effects.performance import PerformanceMonitor, get_monitor
|
||||
from engine.effects.registry import EffectRegistry
|
||||
from engine.effects.types import EffectContext
|
||||
from engine.effects.types import EffectContext, PartialUpdate
|
||||
|
||||
|
||||
class EffectChain:
|
||||
@@ -51,6 +51,18 @@ class EffectChain:
|
||||
frame_number = ctx.frame_number
|
||||
monitor.start_frame(frame_number)
|
||||
|
||||
# Get dirty regions from canvas via context (set by CanvasStage)
|
||||
dirty_rows = ctx.get_state("canvas.dirty_rows")
|
||||
|
||||
# Create PartialUpdate for effects that support it
|
||||
full_buffer = dirty_rows is None or len(dirty_rows) == 0
|
||||
partial = PartialUpdate(
|
||||
rows=None,
|
||||
cols=None,
|
||||
dirty=dirty_rows,
|
||||
full_buffer=full_buffer,
|
||||
)
|
||||
|
||||
frame_start = time.perf_counter()
|
||||
result = list(buf)
|
||||
for name in self._order:
|
||||
@@ -59,7 +71,11 @@ class EffectChain:
|
||||
chars_in = sum(len(line) for line in result)
|
||||
effect_start = time.perf_counter()
|
||||
try:
|
||||
result = plugin.process(result, ctx)
|
||||
# Use process_partial if supported, otherwise fall back to process
|
||||
if getattr(plugin, "supports_partial_updates", False):
|
||||
result = plugin.process_partial(result, ctx, partial)
|
||||
else:
|
||||
result = plugin.process(result, ctx)
|
||||
except Exception:
|
||||
plugin.config.enabled = False
|
||||
elapsed = time.perf_counter() - effect_start
|
||||
|
||||
Reference in New Issue
Block a user