The shadow the forest couldn’t see, falling on itself
Every tree casts a shadow built from its own voxel blocks, and rendering that geometry across a whole canopy was the single biggest cost in the frame. The fix was to shrink each tree into a blockier stand-in and cast its shadow from that instead. It worked — and it had a side effect nobody had planned for: trees started darkening their own leaves.
Ninety percent of a shadow pass, and light too good to lose
Canopy shadow geometry, down to every leaf and branch, made up roughly 90% of everything the renderer drew in the shadow pass, as an earlier measurement pass found. That was the real bottleneck holding the frame rate down, not the number of plants on screen. Turning canopy shadows off entirely would have recovered a lot of it: about 59%, measured directly. It was rejected outright anyway. The dappled, broken light falling through leaves is part of what this game is supposed to look like, and losing it wasn’t a trade we were willing to make for a frame-rate number alone.

A blockier double, cut to size each season
An earlier pass had already recovered a quarter of the frame by shrinking how far out the sun’s shadow bands reach, without changing what any single shadow was made of; this pass leaves the distance alone and shrinks the shape instead.
The fix we shipped keeps every plant’s real shadow. It just computes that shadow from a simpler body. We downsample a plant’s voxel grid to a coarser version of itself, and that coarser copy is what throws the shadow. The tree you actually see stays full detail — drawing it was already a separate, solved bill. The tree the light passes around is a blockier double standing in for it. The double follows the plant through the seasons too, so a bare winter tree correctly casts a bare-trunk shadow instead of dragging a leafy one behind it.
We shipped the feature switched off. The downsampling amount was set to zero, so nothing about how the game looked or ran changed until someone deliberately turned it on, holding back a purely aesthetic call for a human decision rather than an automatic one.
What the review caught before the numbers were trusted
Before we flipped that switch, a review turned up two problems worth catching first. The tool we’d built to measure the feature’s performance impact had leftover code of its own quietly undoing part of the new setup while it ran, corrupting the very benchmark meant to inform our decision. And a check meant to confirm that a winter tree’s shadow actually shrank down with its bare branches was comparing a cached result against itself, so it could never have caught a bug in that behavior even if one existed. We fixed both, and proved each one could actually detect the failure it was supposed to guard against.
With that cleared up, we could finally measure the real benefit — in a scene carrying about 629 creatures and just over 3,000 plants across 63 species. Turning the stand-in shadows on cut the number of canopy shadow shapes the renderer had to process by roughly 13-fold, and it delivered about a 24% frame-rate gain: close to four-fifths of what fully disabling canopy shadows would have bought, while keeping every shadow the game was actually casting.
Three ways around it that didn’t hold up
We tried three other fixes first, and ruled out each one for a concrete reason worth writing down so nobody reaches for it again. Splitting which lights affect which shadows didn’t work, because at that level the renderer couldn’t tell one plant’s shape apart from its neighbor’s. Asking the engine to build a separate, pre-made shadow-only shape for each plant didn’t help either — the problem was the amount of shadow geometry, not which feature delivered it. And a scheme that would have trimmed away solid interior chunks of a plant’s voxel grid, rather than shrinking the whole grid down, broke several tree species outright: in the trimmed shadow, a trunk could end up disconnected from its own crown. We dropped that option and wrote it down as a dead end.
The shadow it couldn’t see
The stand-in shape is deliberately a little larger than the tree it stands in for, generous enough that it never leaves a gap at the tree’s true edge. Once the feature was actually running, that margin turned out to carry a cost nobody had priced: a tree’s own stand-in shadow was overlapping its own foliage.
A tree’s shadow was falling on leaves its real shadow would never have touched.
We left the shadow itself alone and changed who receives it. A tree’s own surface stopped reading shadows cast onto it, while it still throws its shadow onto the ground and onto everything else around it. The self-darkening went away, and nothing about the shadow a tree casts on the rest of the world changed at all.
A setting nobody had actually tested
We checked one more assumption at the same time. The coarseness of the stand-in shape is adjustable: coarser saves more render time but drifts further from the tree’s real silhouette. We had picked a fairly aggressive setting without ever measuring the lighter option next to it. Tested side by side, the coarser setting bought no extra speed at all. It only made the cast shadow noticeably bigger than the truth — about 2.12 times the tree’s real footprint, against roughly 1.45 times at the lighter setting, with no measurable loss of the soft, painterly shadow edges the game is built around. We shipped the lighter setting.
Canopy shadows are live now at the lighter, better-tested setting: still cast in the same broken, dappled pattern the game was built to show, from a shape a fraction the size of the tree itself, and without a single tree left shading its own leaves. The fix landed alongside a handful of other forest corrections that same week: when seeds actually fall, how long a tree lives, how fast the forest’s own clock runs against the rest of the world’s. Each one was a small piece of the same argument, a wood that behaves the way it looks.



