Stress
8,000 sensors on a jittered grid. Every one of them is a real feature-state transition. Kick them all off and watch the frame rail — then raise the stagger and watch it get cheaper.
kick
—ms
fps
—
kick = the synchronous cost of firing the whole batch
setFilter(["<", ["id"], n]) — never setData, which would
rebuild the tiles and drop every feature state
a delayed transition costs nothing per frame until it
starts — raise the spread and watch setFeatureState/frame
collapse, and, once the map is frame-bound, fps climb
channels
3
each channel is a separate map.transition() call on the same
feature, on its own clock
animating
0
channels/frame
7500
setFeatureState/frame
0
p95 frame
—
duration
1200ms ±25%
The rail times the whole map: while anything animates,
MapLibre repaints the basemap every frame, and that alone can miss
the 16.7ms budget. The plugin's share is one setFeatureState per
animating feature per frame — one, not one per channel.