The hitch that vanished by slowing down: growing a meadow without a stutter

← All field notes

A meadow that doesn’t grow isn’t a meadow — it’s a photograph. We wanted thousands of grass plants to climb slowly through their lives, reading the soil and light around them, in a world you could simply sit and watch. The trouble was that doing all that growing the moment the world asked for it made the whole game lurch.

This is the story of the fix, which is the counter-intuitive part: we made the stutter vanish not by growing faster, but by growing slower — and proved we hadn’t changed the meadow at all in the process.

The work, and the budget it blew

Spreading that growing work thin across many frames — advancing only a handful of plants a frame instead of every plant at once — is the approach that first taught the grass to grow without a hitch; this post is about a sharper edge of it. The setup is the same one: when the slow ecology cycle ticks, advancing roughly two thousand plants in a single pass cost about a sixth of a second, again and again every fraction of a second — an unplayable lurch on a steady, ugly cadence.

We sized the per-frame slice against the cost measured in a crowded frame rather than a quiet room — the same hard-won lesson the rainfall freeze wrote down — because under real contention each plant costs more than the clean-room estimate suggests.

The fix: fall behind on purpose

Here is the counter-intuitive heart of it, and the part this post owns. We didn’t just slice the pass up — we let growth quietly fall behind the wall clock. Advancing only about a dozen plants a frame on a small fixed budget means a full sweep takes on the order of a hundred-plus frames, so the plants grow a little slower than the cycle nominally asks.

The number is the surprising part. Where the clock ticks five-or-so beats a second, the actual growing creeps along at roughly a third of a beat a second of effective progress — about a fivefold slowdown. On any system where pace mattered, that would be a disaster. But growth in this world already plays out over in-world years, so a slowdown of that scale is completely imperceptible. You never see it. You only feel the absence of the stutter. Instantaneous became imperceptible — and the whole trade cost nothing.

A calm golden-hour voxel meadow thick with grass at many different heights, from fresh seedlings to tall mature blades, across soft rounded hills with a river beyond.Concept art · pre‑alpha
Grass at every stage of its life, growing so slowly you’d never catch it move — which is exactly why it could afford to grow slower still.

What makes it safe instead of reckless

Letting time fall behind sounds like the kind of shortcut that quietly makes a world unpredictable. The thing that keeps it honest is that growing here was never tied to how the frames happen to land. It is tied to a counted index of how many growth-steps have happened — a sequence, advanced in order. So the same world, from the same seed, always grows into exactly the same meadow, whether the work was done all at once or dribbled out across a hundred-odd frames. The pace of the work is free to change; the order of the steps is not. (Holding a living ecology to a perfectly repeatable save is a craft of its own, and we tell it in full here.)

That a sliced pass comes out byte-identical to a single-breath one is the proof the slice-across-frames approach already stands on — here it rests on one fact that matters for what follows: the values shared across a whole step are computed once and held fixed across every slice of it, nothing recomputed mid-stride that could quietly drift.

The trap hiding in a pass that spans frames

There was one subtle snare, and it’s the kind that only appears once you spread work out. A single growth pass now stretches across many frames — and during those frames, the clock keeps moving. If each plant simply read the current moment when its turn came up, then a plant advanced early in the pass and a plant advanced a hundred frames later would be reading from two slightly different instants. The pass would no longer be a single coherent step; it would smear across time.

So we pinned it. The moment-in-time each plant reads from is latched to the growth-step’s own index and held constant across the entire spread-out pass, rather than re-read from a clock that keeps ticking underneath. Every plant in a given step reads from the same frozen instant, no matter which frame it actually got its turn on. With that latch in place, the same fingerprint that describes a correct meadow came out unchanged all the way through the spread-out path — the slow road and the fast road arrive at the very same world.


A pattern, not a one-off

The shape of this fix — give a heavy background system a small, fixed per-frame budget and let it sip rather than gulp — is one the project leans on more than once. The same idea, applied to the rainfall the erosion simulation needs, cleared a recurring freeze that hid inside the rain; that’s its own postmortem, and a near-twin of this one. The principle underneath both is the same: a system is allowed to fall behind the simulation clock, but it must never block the rendered frame.

What this particular slice taught us is narrower and, I think, more surprising. For a world that is deliberately slow — where the thing you’re computing unfolds over years — the cure for a performance hitch is often to do the work more slowly, not faster. You spread it thin, you let it lag, and the lag costs nothing because the world it models is already patient. The only hard rule is that slowing down may not be allowed to change the answer. We held growth to a counted sequence, latched its inputs to the step, and proved the meadow came out identical either way. After that, the stutter had nowhere left to hide.

For a slow world, the fix for a stutter is often to grow slower — spread thin, let it lag, and prove the world it leaves behind is exactly the same one.

Keep reading

Concept art · pre‑alpha