One million particles
Positions and velocities live in GPU storage buffers. A TSL compute pass advances them every frame and the InstancedMesh reads the same buffer as an instanced attribute — nothing round-trips through JavaScript.

Reduced motion is on — showing the poster instead of the live scene.
Slider from 100 k to 1 M on WebGPU. With ?forceWebGL=1 the same graph runs through transform feedback at about 50 k particles.