Skip to content

MLP205: wait(frozen_frame=False) re-renders identical frames

qual reports MLP205 when a Scene.wait(frozen_frame=False) call provably has zero dynamic content over its span — no scene updater, no stop condition, no registered mobject updater of any arity, no object of a class with intrinsic per-frame behavior (such as TracedPath), and no unknown callback — yet forces the full per-frame pipeline for every frame.

  • Default severity: warning
  • Minimum confidence: high
  • Implementation phase: 3
  • Fix: none

Thresholds (documented constants in rules/performance/timing.rs):

  • MLP205_MIN_WAIT_SECONDS = 2.0 — shorter static waits re-render few frames and are not worth a warning;
  • MLP205_MIN_PIXEL_AREA = 1280 × 720 — below 720p the redundant full-frame raster is cheap. Every analyzed profile must exceed it.

Any Maybe fact silences the rule: an updater registered on only some paths, an unknown-kind object possibly in the family, an assigned always_update_mobjects, or a branch-dependent wait. Freezing does not shorten the video — the encoder still writes the full duration — it skips the per-frame update, interpolation, and raster work.

Wrong

class Demo(Scene):
    def construct(self):
        square = Square()
        self.add(square)
        self.wait(3, frozen_frame=False)
class Demo(Scene):
    def construct(self):
        square = Square()
        self.add(square)
        self.wait(3)