search ESC

Searching…

No results for "".

Type at least 2 characters to search.

Docs

FramePerfWatcher

Field Value
Contract TelescopeWatcher
Name frame_perf
Auto-install No (opt-in via TelescopePlugin.registerWatcher(FramePerfWatcher()))
Ring buffer TelescopeStore._framePerf (own capacity, default 3600, independent of the shared 500-entry cap)
VM extension ext.telescope.frames
CLI command telescope:frames
MCP tool telescope_frames
Opt-out Do not register it; it is never auto-installed

Captures per-frame performance by joining two sources the engine reports separately: frame magnitude from SchedulerBinding.addTimingsCallback, and per-frame attribution drained from FlutterTimeline at the end of every frame. The two arrive at different times, so the post-frame drain parks its block map in a bounded pending map and the timings callback is the only emission point, popping the matching map and writing one complete FramePerfRecord per FrameTiming.

addTimingsCallback appends to a list rather than replacing a single global slot, so there is nothing to chain-preserve here: every other listener (sentry_flutter's among them) keeps receiving timings while this watcher is installed.

Liveness

A static livenessCounter, incremented once per drawn frame regardless of whether a measurement session is running, is the only reliable proof the engine is rendering. It is exposed alongside every ext.telescope.frames response so a caller can tell an empty result caused by a quiet app from one caused by a stalled engine (a backgrounded Chrome tab suspends requestAnimationFrame while every other in-app health signal keeps reading healthy).

Attribution

Attribution only flows while FlutterTimeline.debugCollectionEnabled is true, which a measurement session turns on. Until then the watcher records frame magnitude alone and every record's blocks map is empty.

Registration

if (kDebugMode) {
  TelescopePlugin.install();
  TelescopePlugin.registerWatcher(FramePerfWatcher()); // opt-in
}

Opt-out: simply omit the registerWatcher(FramePerfWatcher()) call.

See the MCP tool reference for the full telescope_frames input schema and output shape.