mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-28 20:16:52 -06:00
Problem: while a preview played, the RAM preview cache evicted the least recently used frame. The frames just ahead of the playhead had been rendered (prefetched) before the frames just shown, so once the cache was full they were evicted first; prefetch asked for them again, but its queue ran in request order, so they waited behind every frame further ahead. Playback ran into a gap right ahead of the playhead while frames far ahead stayed green, re-rendered the same frames over and over (about four renders per frame shown when the preview was longer than the cache) and stalled for seconds. The prefetch window could also reach further ahead than the cache holds. Fix: the playing preview tells Frames where it is (Frames::set_playhead). Evictions then take frames the preview does not reach first (other series, behind it without looping), least recently used first, then the frame it reaches last; prefetch renders the frame it reaches first; queued prefetch frames it no longer reaches are dropped (and leave the in-flight set). The prefetch window stops at what the cache holds. The viewer puts a CPU frame that needs no averaging on screen without copying its pixels. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>