# {py:mod}`simvx.graphics.frame_loop` ```{py:module} simvx.graphics.frame_loop ``` ```{autodoc2-docstring} simvx.graphics.frame_loop :allowtitles: ``` ## Module Contents ### Classes ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`FrameClock ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameClock :summary: ``` * - {py:obj}`FixedStepClock ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.FixedStepClock :summary: ``` * - {py:obj}`RealTimeClock ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.RealTimeClock :summary: ``` * - {py:obj}`FrameSink ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameSink :summary: ``` * - {py:obj}`SwapchainSink ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.SwapchainSink :summary: ``` * - {py:obj}`OffscreenSink ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.OffscreenSink :summary: ``` * - {py:obj}`StreamSink ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.StreamSink :summary: ``` * - {py:obj}`FrameIntegration ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration :summary: ``` * - {py:obj}`HeadlessIntegration ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.HeadlessIntegration :summary: ``` * - {py:obj}`StreamingIntegration ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.StreamingIntegration :summary: ``` * - {py:obj}`WindowedIntegration ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.WindowedIntegration :summary: ``` * - {py:obj}`FrameService ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameService :summary: ``` * - {py:obj}`FrameServices ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameServices :summary: ``` * - {py:obj}`FrameLoop ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameLoop :summary: ``` ```` ### Functions ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`active_loops ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.active_loops :summary: ``` ```` ### Data ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`log ` - ```{autodoc2-docstring} simvx.graphics.frame_loop.log :summary: ``` ```` ### API ````{py:data} log :canonical: simvx.graphics.frame_loop.log :value: > 'getLogger(...)' ```{autodoc2-docstring} simvx.graphics.frame_loop.log ``` ```` ````{py:function} active_loops() -> list[FrameLoop] :canonical: simvx.graphics.frame_loop.active_loops ```{autodoc2-docstring} simvx.graphics.frame_loop.active_loops ``` ```` `````{py:class} FrameClock :canonical: simvx.graphics.frame_loop.FrameClock ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameClock ``` ````{py:method} on_begin(app: simvx.graphics.app.App) -> None :canonical: simvx.graphics.frame_loop.FrameClock.on_begin ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameClock.on_begin ``` ```` ````{py:method} should_stop(frame_idx: int) -> bool :canonical: simvx.graphics.frame_loop.FrameClock.should_stop ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameClock.should_stop ``` ```` ````{py:method} advance(app: simvx.graphics.app.App) -> float :canonical: simvx.graphics.frame_loop.FrameClock.advance :abstractmethod: ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameClock.advance ``` ```` ````{py:method} step_physics(app: simvx.graphics.app.App, tree: typing.Any, frame_dt: float) -> None :canonical: simvx.graphics.frame_loop.FrameClock.step_physics :abstractmethod: ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameClock.step_physics ``` ```` ````{py:method} tick_logic(app: simvx.graphics.app.App, tree: typing.Any, frame_dt: float) -> None :canonical: simvx.graphics.frame_loop.FrameClock.tick_logic ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameClock.tick_logic ``` ```` ````` `````{py:class} FixedStepClock(*, frames: int | None = None, dt: float | None = None) :canonical: simvx.graphics.frame_loop.FixedStepClock Bases: {py:obj}`simvx.graphics.frame_loop.FrameClock` ```{autodoc2-docstring} simvx.graphics.frame_loop.FixedStepClock ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.graphics.frame_loop.FixedStepClock.__init__ ``` ````{py:method} should_stop(frame_idx: int) -> bool :canonical: simvx.graphics.frame_loop.FixedStepClock.should_stop ```{autodoc2-docstring} simvx.graphics.frame_loop.FixedStepClock.should_stop ``` ```` ````{py:method} advance(app: simvx.graphics.app.App) -> float :canonical: simvx.graphics.frame_loop.FixedStepClock.advance ```{autodoc2-docstring} simvx.graphics.frame_loop.FixedStepClock.advance ``` ```` ````{py:method} step_physics(app: simvx.graphics.app.App, tree: typing.Any, frame_dt: float) -> None :canonical: simvx.graphics.frame_loop.FixedStepClock.step_physics ```{autodoc2-docstring} simvx.graphics.frame_loop.FixedStepClock.step_physics ``` ```` ````{py:method} tick_logic(app: simvx.graphics.app.App, tree: typing.Any, frame_dt: float) -> None :canonical: simvx.graphics.frame_loop.FixedStepClock.tick_logic ```{autodoc2-docstring} simvx.graphics.frame_loop.FixedStepClock.tick_logic ``` ```` ````{py:method} on_begin(app: simvx.graphics.app.App) -> None :canonical: simvx.graphics.frame_loop.FixedStepClock.on_begin ```` ````` `````{py:class} RealTimeClock() :canonical: simvx.graphics.frame_loop.RealTimeClock Bases: {py:obj}`simvx.graphics.frame_loop.FrameClock` ```{autodoc2-docstring} simvx.graphics.frame_loop.RealTimeClock ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.graphics.frame_loop.RealTimeClock.__init__ ``` ````{py:method} on_begin(app: simvx.graphics.app.App) -> None :canonical: simvx.graphics.frame_loop.RealTimeClock.on_begin ```` ````{py:method} advance(app: simvx.graphics.app.App) -> float :canonical: simvx.graphics.frame_loop.RealTimeClock.advance ```{autodoc2-docstring} simvx.graphics.frame_loop.RealTimeClock.advance ``` ```` ````{py:method} step_physics(app: simvx.graphics.app.App, tree: typing.Any, frame_dt: float) -> None :canonical: simvx.graphics.frame_loop.RealTimeClock.step_physics ```{autodoc2-docstring} simvx.graphics.frame_loop.RealTimeClock.step_physics ``` ```` ````{py:method} should_stop(frame_idx: int) -> bool :canonical: simvx.graphics.frame_loop.RealTimeClock.should_stop ```` ````{py:method} tick_logic(app: simvx.graphics.app.App, tree: typing.Any, frame_dt: float) -> None :canonical: simvx.graphics.frame_loop.RealTimeClock.tick_logic ```` ````` `````{py:class} FrameSink :canonical: simvx.graphics.frame_loop.FrameSink ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameSink ``` ````{py:attribute} ring_capacity :canonical: simvx.graphics.frame_loop.FrameSink.ring_capacity :type: int :value: > 2 ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameSink.ring_capacity ``` ```` ````{py:method} render_thread_capture() -> collections.abc.Callable[[int, typing.Any], None] | None :canonical: simvx.graphics.frame_loop.FrameSink.render_thread_capture ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameSink.render_thread_capture ``` ```` ````{py:method} capture_synchronous(loop: simvx.graphics.frame_loop.FrameLoop, frame_idx: int) -> None :canonical: simvx.graphics.frame_loop.FrameSink.capture_synchronous ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameSink.capture_synchronous ``` ```` ````` `````{py:class} SwapchainSink :canonical: simvx.graphics.frame_loop.SwapchainSink Bases: {py:obj}`simvx.graphics.frame_loop.FrameSink` ```{autodoc2-docstring} simvx.graphics.frame_loop.SwapchainSink ``` ````{py:attribute} ring_capacity :canonical: simvx.graphics.frame_loop.SwapchainSink.ring_capacity :value: > 2 ```{autodoc2-docstring} simvx.graphics.frame_loop.SwapchainSink.ring_capacity ``` ```` ````{py:method} render_thread_capture() -> collections.abc.Callable[[int, typing.Any], None] | None :canonical: simvx.graphics.frame_loop.SwapchainSink.render_thread_capture ```` ````{py:method} capture_synchronous(loop: simvx.graphics.frame_loop.FrameLoop, frame_idx: int) -> None :canonical: simvx.graphics.frame_loop.SwapchainSink.capture_synchronous ```` ````` `````{py:class} OffscreenSink(*, capture_frames: collections.abc.Sequence[int] | None = (), capture_fn: collections.abc.Callable[[int], bool] | None = None) :canonical: simvx.graphics.frame_loop.OffscreenSink Bases: {py:obj}`simvx.graphics.frame_loop.FrameSink` ```{autodoc2-docstring} simvx.graphics.frame_loop.OffscreenSink ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.graphics.frame_loop.OffscreenSink.__init__ ``` ````{py:attribute} ring_capacity :canonical: simvx.graphics.frame_loop.OffscreenSink.ring_capacity :value: > 1 ```{autodoc2-docstring} simvx.graphics.frame_loop.OffscreenSink.ring_capacity ``` ```` ````{py:method} render_thread_capture() -> collections.abc.Callable[[int, typing.Any], None] :canonical: simvx.graphics.frame_loop.OffscreenSink.render_thread_capture ```` ````{py:method} capture_synchronous(loop: simvx.graphics.frame_loop.FrameLoop, frame_idx: int) -> None :canonical: simvx.graphics.frame_loop.OffscreenSink.capture_synchronous ```` ````` `````{py:class} StreamSink(server: typing.Any) :canonical: simvx.graphics.frame_loop.StreamSink Bases: {py:obj}`simvx.graphics.frame_loop.FrameSink` ```{autodoc2-docstring} simvx.graphics.frame_loop.StreamSink ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.graphics.frame_loop.StreamSink.__init__ ``` ````{py:attribute} ring_capacity :canonical: simvx.graphics.frame_loop.StreamSink.ring_capacity :value: > 2 ```{autodoc2-docstring} simvx.graphics.frame_loop.StreamSink.ring_capacity ``` ```` ````{py:method} render_thread_capture() -> collections.abc.Callable[[int, typing.Any], None] :canonical: simvx.graphics.frame_loop.StreamSink.render_thread_capture ```` ````{py:method} capture_synchronous(loop: simvx.graphics.frame_loop.FrameLoop, frame_idx: int) -> None :canonical: simvx.graphics.frame_loop.StreamSink.capture_synchronous ```` ````` `````{py:class} FrameIntegration :canonical: simvx.graphics.frame_loop.FrameIntegration ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration ``` ````{py:attribute} reset_globals :canonical: simvx.graphics.frame_loop.FrameIntegration.reset_globals :type: bool :value: > False ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration.reset_globals ``` ```` ````{py:method} on_run_begin(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.FrameIntegration.on_run_begin ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration.on_run_begin ``` ```` ````{py:method} on_run_end(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.FrameIntegration.on_run_end ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration.on_run_end ``` ```` ````{py:method} on_setup(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.FrameIntegration.on_setup ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration.on_setup ``` ```` ````{py:method} pre_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> bool :canonical: simvx.graphics.frame_loop.FrameIntegration.pre_tick ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration.pre_tick ``` ```` ````{py:method} mid_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.FrameIntegration.mid_tick ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration.mid_tick ``` ```` ````{py:method} post_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.FrameIntegration.post_tick ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration.post_tick ``` ```` ````{py:method} per_frame_telemetry(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.FrameIntegration.per_frame_telemetry ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration.per_frame_telemetry ``` ```` ````{py:method} on_loop_end(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.FrameIntegration.on_loop_end ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration.on_loop_end ``` ```` ````{py:method} pre_render(loop: simvx.graphics.frame_loop.FrameLoop, cmd: typing.Any) -> None :canonical: simvx.graphics.frame_loop.FrameIntegration.pre_render ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameIntegration.pre_render ``` ```` ````` `````{py:class} HeadlessIntegration(on_frame: collections.abc.Callable[[int, float], bool | None] | None = None) :canonical: simvx.graphics.frame_loop.HeadlessIntegration Bases: {py:obj}`simvx.graphics.frame_loop.FrameIntegration` ```{autodoc2-docstring} simvx.graphics.frame_loop.HeadlessIntegration ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.graphics.frame_loop.HeadlessIntegration.__init__ ``` ````{py:attribute} reset_globals :canonical: simvx.graphics.frame_loop.HeadlessIntegration.reset_globals :value: > True ```{autodoc2-docstring} simvx.graphics.frame_loop.HeadlessIntegration.reset_globals ``` ```` ````{py:method} pre_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> bool :canonical: simvx.graphics.frame_loop.HeadlessIntegration.pre_tick ```` ````{py:method} on_loop_end(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.HeadlessIntegration.on_loop_end ```` ````{py:method} on_run_begin(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.HeadlessIntegration.on_run_begin ```` ````{py:method} on_run_end(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.HeadlessIntegration.on_run_end ```` ````{py:method} on_setup(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.HeadlessIntegration.on_setup ```` ````{py:method} mid_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.HeadlessIntegration.mid_tick ```` ````{py:method} post_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.HeadlessIntegration.post_tick ```` ````{py:method} per_frame_telemetry(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.HeadlessIntegration.per_frame_telemetry ```` ````{py:method} pre_render(loop: simvx.graphics.frame_loop.FrameLoop, cmd: typing.Any) -> None :canonical: simvx.graphics.frame_loop.HeadlessIntegration.pre_render ```` ````` `````{py:class} StreamingIntegration(server: typing.Any) :canonical: simvx.graphics.frame_loop.StreamingIntegration Bases: {py:obj}`simvx.graphics.frame_loop.FrameIntegration` ```{autodoc2-docstring} simvx.graphics.frame_loop.StreamingIntegration ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.graphics.frame_loop.StreamingIntegration.__init__ ``` ````{py:method} on_run_begin(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.StreamingIntegration.on_run_begin ```` ````{py:method} on_run_end(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.StreamingIntegration.on_run_end ```` ````{py:method} pre_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> bool :canonical: simvx.graphics.frame_loop.StreamingIntegration.pre_tick ```` ````{py:method} pre_render(loop: simvx.graphics.frame_loop.FrameLoop, cmd: typing.Any) -> None :canonical: simvx.graphics.frame_loop.StreamingIntegration.pre_render ```` ````{py:attribute} reset_globals :canonical: simvx.graphics.frame_loop.StreamingIntegration.reset_globals :type: bool :value: > False ```` ````{py:method} on_setup(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.StreamingIntegration.on_setup ```` ````{py:method} mid_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.StreamingIntegration.mid_tick ```` ````{py:method} post_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.StreamingIntegration.post_tick ```` ````{py:method} per_frame_telemetry(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.StreamingIntegration.per_frame_telemetry ```` ````{py:method} on_loop_end(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.StreamingIntegration.on_loop_end ```` ````` `````{py:class} WindowedIntegration() :canonical: simvx.graphics.frame_loop.WindowedIntegration Bases: {py:obj}`simvx.graphics.frame_loop.FrameIntegration` ```{autodoc2-docstring} simvx.graphics.frame_loop.WindowedIntegration ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.graphics.frame_loop.WindowedIntegration.__init__ ``` ````{py:method} on_run_end(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.WindowedIntegration.on_run_end ```` ````{py:method} on_setup(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.WindowedIntegration.on_setup ```` ````{py:method} mid_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.WindowedIntegration.mid_tick ```` ````{py:method} post_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.WindowedIntegration.post_tick ```` ````{py:method} per_frame_telemetry(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.WindowedIntegration.per_frame_telemetry ```` ````{py:attribute} reset_globals :canonical: simvx.graphics.frame_loop.WindowedIntegration.reset_globals :type: bool :value: > False ```` ````{py:method} on_run_begin(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.WindowedIntegration.on_run_begin ```` ````{py:method} pre_tick(loop: simvx.graphics.frame_loop.FrameLoop) -> bool :canonical: simvx.graphics.frame_loop.WindowedIntegration.pre_tick ```` ````{py:method} on_loop_end(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.WindowedIntegration.on_loop_end ```` ````{py:method} pre_render(loop: simvx.graphics.frame_loop.FrameLoop, cmd: typing.Any) -> None :canonical: simvx.graphics.frame_loop.WindowedIntegration.pre_render ```` ````` `````{py:class} FrameService :canonical: simvx.graphics.frame_loop.FrameService ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameService ``` ````{py:method} on_frame_service(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.FrameService.on_frame_service ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameService.on_frame_service ``` ```` ````{py:method} on_loop_end(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.FrameService.on_loop_end ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameService.on_loop_end ``` ```` ````` `````{py:class} FrameServices() :canonical: simvx.graphics.frame_loop.FrameServices ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameServices ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameServices.__init__ ``` ````{py:method} add(service: simvx.graphics.frame_loop.FrameService) -> simvx.graphics.frame_loop.FrameService :canonical: simvx.graphics.frame_loop.FrameServices.add ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameServices.add ``` ```` ````{py:method} remove(service: simvx.graphics.frame_loop.FrameService) -> None :canonical: simvx.graphics.frame_loop.FrameServices.remove ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameServices.remove ``` ```` ````{py:method} __bool__() -> bool :canonical: simvx.graphics.frame_loop.FrameServices.__bool__ ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameServices.__bool__ ``` ```` ````{py:method} run(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.FrameServices.run ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameServices.run ``` ```` ````{py:method} close(loop: simvx.graphics.frame_loop.FrameLoop) -> None :canonical: simvx.graphics.frame_loop.FrameServices.close ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameServices.close ``` ```` ````` `````{py:class} FrameLoop(app: simvx.graphics.app.App, root_node: typing.Any, *, clock: simvx.graphics.frame_loop.FrameClock, sink: simvx.graphics.frame_loop.FrameSink, integration: simvx.graphics.frame_loop.FrameIntegration, visible: bool, vsync: bool) :canonical: simvx.graphics.frame_loop.FrameLoop ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameLoop ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameLoop.__init__ ``` ````{py:attribute} engine :canonical: simvx.graphics.frame_loop.FrameLoop.engine :type: simvx.graphics.engine.Engine :value: > None ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameLoop.engine ``` ```` ````{py:method} run() -> None :canonical: simvx.graphics.frame_loop.FrameLoop.run ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameLoop.run ``` ```` ````{py:method} begin() -> None :canonical: simvx.graphics.frame_loop.FrameLoop.begin ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameLoop.begin ``` ```` ````{py:method} step_frame(dt: float | None = None) -> bool :canonical: simvx.graphics.frame_loop.FrameLoop.step_frame ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameLoop.step_frame ``` ```` ````{py:method} capture(*, scale: float = 1.0, region: tuple[int, int, int, int] | None = None) -> typing.Any :canonical: simvx.graphics.frame_loop.FrameLoop.capture ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameLoop.capture ``` ```` ````{py:method} end() -> None :canonical: simvx.graphics.frame_loop.FrameLoop.end ```{autodoc2-docstring} simvx.graphics.frame_loop.FrameLoop.end ``` ```` `````