The Fountain That Stayed Up
Push a 2D particle fountain hard enough and the whole frame used to blink out to a flat blank. No error, no warning, just gone. Now the fountain keeps spraying and tells you when you've asked for more than it can draw.


A particle fountain is a spending dial. Turn spawn_rate up and the spray gets denser, the falloff richer, the whole thing more alive. In a live set that dial is one of the first things a hand reaches for when a track lifts. So the fountain has to hold under a heavy hand, and this one did not.
A dial that reached a cliff
Past roughly 132,000 particles on screen at once, the entire output went flat. Not the fountain, the whole frame. One colour, edge to edge, no fountain, no background, nothing. Exit code clean, log empty, as if that blank was the picture you asked for.
Here is the same patch, the spawn dial pushed to a 200,000-particle pool, before and after:


The cause was a hard limit in the CPU drawing path. Every particle became one draw command, and the command buffer that collects them has a ceiling. Cross it and the buffer overflows, the renderer gives up on the frame, and the failure paints the whole canvas one colour. Which colour depends on the day. The point is that a single dial, turned a little too far, took down everything on screen and said nothing about it.
For a live instrument that is the worst kind of failure. It is silent, it is total, and it arrives at the exact moment you were reaching for more.
A ceiling you can see
The fix gives the fountain a ceiling it can live under. It now draws the 100,000 oldest particles, comfortably below the cliff, and drops the rest rather than the frame. Oldest first is a deliberate choice: the particles you keep are the ones already on screen, so the spray stays steady instead of flickering as the count rides the limit.
And when the ceiling engages, it says so. A line in the log tells you how many particles you asked for, how many are drawing, and how many were dropped, throttled to once a second so a sustained overflow does not bury the console. The dial still moves, the fountain still fills the frame, and the thing that used to be a wipeout is now a note you can read.
The real ceiling is higher
100,000 is the CPU path being honest about its limits. The GPU particle system, coming later, has no per-particle draw command at all, so the cliff simply does not exist there and the ceiling lifts. Until then the fountain holds: push the dial as hard as you like, and the worst that happens is some of the spray thins out and a line appears in the log. The frame stays up.
There is a test now that drives the fountain to a 200,000-particle pool, and then to a million, and checks that the frame comes back full of colour instead of collapsed to one. A wipeout has exactly one colour in it. A fountain has thousands. That gap is easy to measure and hard to fake, which is the kind of tripwire you want under a failure that used to arrive without a sound.