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.