Second Chance GazetteDevlogToken Use

Ninety-Six Percent

unreal-engineperformancenavigationnavmeshnav-linksphysicsmetahumanhairworld-partitionclaude-codefablegta-vi

Tuesday

By the time James noticed the offer, his weekly allowance on Claude Code was at 96 percent.

The offer was a reset: take the new model, Fable 5.2, and the counter went back to zero. Half of the weekly limit belongs to Fable and half to Opus, so the sensible order would have been Fable at 50 percent, then the reset at 100, then Opus again on the fresh half. He did it the other way round, at 96, and has not got over it. It was Tuesday, and the limit would not come back on its own until Wednesday at nine.

So the day had a rule. The sessions most likely to change what a player sees went first. The small things, the animation that is nearly right, would wait for the morning the tokens came back.

Four sessions ran on Fable 5.2, from ten to eight in the morning until the limit went at twenty to two. The agent was still Claude Code Opus 5.5 for the rest. James's verdict on the two, both run at Medium effort: he could not tell them apart.

Two frames a second

The frame-rate pass had a number from the day before. Stood at an arcade coin machine, the game took between 500 and 616 milliseconds to draw a frame. That is about two frames a second.

The machine is a coin pusher, a shelf that slides back and forth and shoves a few hundred coins with it. Every coin is a physics body, and the engine simulates every one of them whether or not anybody is near. The agent made the machines and their coins stay frozen until the player is within six metres. Stood at one, the frame came down to between 55 and 62 milliseconds.

It also wrote a small system that changes how many physics sub-steps the engine runs by what the player is near. Near a coin machine it runs four. The agent tried two, to save more, and the pile of coins never settled. Five hundred and thirty coins jittered at 150 milliseconds a frame until it was put back. Four is the floor.

One thing it had down as a bug was not one. Every thirty seconds the frame jumps to about 100 milliseconds for a few seconds, and the handover for the machine says why: that is the shelf's forward stroke, and it really is moving 230 coins.

The bin lorry was next. While it drives, it checks all 724 bins in the town for something to knock over or dodge, twice, every frame. That was 17.5 milliseconds a frame on its own, the biggest single cost in the game thread. It now looks a few times a second and costs 11.5. The agent wrote a function that asks for only the bins within thirty metres, about one millisecond, and built it green. It is not connected. Playing the bin round with the throttle on is next.

Rockstar will have a performance team for GTA VI. He had a Tuesday, a dwindling counter and one 8 GB card.

The barmaid who lost her hair

The pass also tried to give back graphics memory. A hair groom, the strands a MetaHuman wears, costs far more than the body under it. All the textures in the world came to about 900 MB, less than the hair alone, which is 1.2 GB. So the agent unloaded the hair on bodies that are far away and unseen, and freed between 400 and 540 MB in the morning test. It looked fine.

A woman behind a nightclub bar in a white top and green trousers with a smooth bald head, dancers in purple light behind her and a shelf of upturned spirit bottles to the right.
Jess behind the Sweatbox bar at a metre and a half, with the hair stream on.

Jess, who serves at the Sweatbox, was bald. The morning's test had been done at the high setting on a different resident. This one was at the low setting and the strands did not come back after being released. The agent switched the whole feature off in the settings file at five to one. With it off she has all her curls.

The same woman behind the same bar with a full head of dark curly hair, dancers and purple light behind her and the spirit bottles to the right.
The same bar, the same woman, with the feature switched off.

The saving went with it. It comes back when somebody works out why the restore fails at the low setting.

Eighty-five centimetres, again

The shop-front steps from Monday evening were the thread the whole day had been queuing behind. The plan was four staircases, one for each takeaway on the parade, built from the measured height of each doorstep. The agent had built them in Blender and placed them in the town, and every step of that had passed its checks.

Then it ran the probe. The probe asks the navmesh for a walkable route from the pavement to inside the shop, and from inside to the pavement, for each of the four doors. It failed. It failed again with the landing made 40 centimetres bigger. The partial path ended at the landing both times, and the agent, which had checked that navmesh existed on the middle of the landing and on parts of each flight, could not say where it broke.

The editor made it harder. Loading the level from inside a script crashed it twice, six seconds after it finished loading, and the agent's own log said only that the audio device had timed out. The editor's own load command did not, so it used that one and put the steps back to how they had been that morning, the actors moved to a backup folder, not deleted.

The break, when it was found, was not in the steps. The door. The doorway into the shop was not passable on the navmesh at all, and the old one-way links that dropped a resident off the sill now ended under the new steps. The fix was a pair of two-way links, one for each door, between the inside of the shop and the landing at the top of the steps. The gate passed at twenty past three: four routes complete, every other building checked and unchanged.

A short flight of stone steps turning along the front of a brick shop, with a black handrail and balusters, a lit doorway above and a figure in a grey hoodie behind the glass.
The Kebabylon steps from the pavement: five risers turning along the shopfront, a rail with balusters, and a resident standing in the doorway.

The lads on the snack run got to Slice Slice Baby, the next shop along, one metre from the door after eight seconds and two metres after fourteen. They had walked it. The jump that used to carry them across unseen is switched off by default now, with the steps built.

Low view of stone shopfront steps with a black rail at dusk, a hooded figure standing at the top by the door and two more walking away along the pavement towards an orange sky.
From a low angle at dusk. A resident waits at the top, two more are walking away along the parade.

Cars on the kerb, bins on the pavement

In the evening the thread that began on Sunday with one car parked on a wall finished its first round. Cars in the game are parked by finding the kerb and putting their wheels up against it. The kerb finder looked for one 5 centimetre step that rises at least 6 centimetres. The road meshes model a kerb as a slope, so no single step is ever that tall and it never found a kerb. The agent changed it to measure the rise across a window of about 15 centimetres. A car that had been parked against a post was on the tarmac at the kerb, two and a third metres from it.

At the same time a pass moved 930 of the town's 1,010 wheelie bins onto the pavement round the 61 audited parked cars. Eighty stayed where they were, because a door or a flight of steps or a car was in the way. Another car on the same road now says it is standing on a bin.

At twenty past seven a different slot opened on the club. The seating went in, four tables with two chairs each, and the chair's front turned out to be its minus Y direction, so the sitter faces the actor's yaw plus 270. A high table's stand point was 125 centimetres under the gallery floor because the table's bounding box reaches below the floor. Christie's club routine, the one that walks her to the bar, had her bar point 45 centimetres from the customer face of the counter, in the middle of the serving spots. It is now beyond the south end. In a game left to run on its own the club opened, dancers joined, one went to the bar and a Pornstar Martini took 11 steps to make and 2.1 units of the drink to serve. It was a Monday on the game's clock. The dance floor was nearly empty.

The fault

Frame time 500-616 ms standing at physics-heavy props (coin pusher) in Unreal Engine 5.8

Standalone game, low setting. Hundreds of physics bodies on the pusher shelf simulate whatever the player is doing. A further spike to about 100 ms every 30 s is the shelf's real stroke moving about 230 coins, not a bug.

The fix

Freeze beyond 6 m, four sub-steps near, never two

Machines and their coins are frozen until the player is within 6 m: the frame falls to 55-62 ms. A system writes MaxSubsteps and MaxSubstepDeltaTime on the physics settings by proximity: 4 x 8.33 ms near a coin machine. Two sub-steps destabilised the pile (530 coins never settled, 150 ms). Elsewhere the authored values stay, because two steps gave no gain in the town.

The fault

Blueprint searches every actor of a tag every frame: 17.5 ms per frame from one vehicle

GetAllActorsWithTag("Bin") over about 724 bins, called twice by the lorry's drive step while it moves. About 1,600 other small tick functions cost another 12.7-13.5 ms, mostly far MetaHuman bodies and skeletal trees.

The fix

Scan on a timer; far bodies tick twice a second

The scan runs every 0.15 s: 17.5 to 11.5 ms. Bodies and trees beyond 60 m and unseen for 2 s get a 0.5 s tick interval: updates per frame 1,709 to 1,172. A cached spatial lookup of bins within a radius (about 1 ms) is built but not wired in. Guard: the on/off comparison of the tick throttle was too noisy to prove its own gain.

The fault

MetaHuman hair disappears after groom unload and restore (bald NPC at close range)

Unloading hair groom assets for far, unseen characters freed 400-540 MB of graphics memory. A resident at 1.5 m at the low scalability setting was bald after release, and the restore did not bring the groom back. The earlier test had been at high and on another resident.

The fix

Switched off in the ini; not fixed

TownLife.HairStream.Enable is 0. Curls back. Not turned on again without a close-up A/B at the low setting and at high. Guard: test a release and restore cycle on a shared asset at both scalability settings.

The fault

Shop-front steps fail the navmesh probe: partial path ends at the landing

Both attempts, landing 120 then 160 cm. Navmesh exists on the landing centre and parts of the flights, so it is not simple erosion. The break is the doorway itself (not passable), and the older one-way drop links now end under the steps. Separately, load_level called from a Slate post-tick callback crashed the editor twice, 6 s after a 2ndChance load, with an audio device timeout in the log.

The fix

A NavLinkProxy per shop, both ways, inside to landing. Probe: four routes complete, other buildings unchanged, navmesh saved and verified static. Load the level with the editor's own command and watch the log before any other call.

The fault

Cars parked "against a wall or post": kerb never found

FindKerbEdge needed one 5 cm step to rise 6 cm or more. Road profile meshes model the kerb as a slope, so no step qualified.

The fix

Measure the rise over a 15 cm window

Warnings "against a wall or post" 2 to 0, "touched a wall" 1 to 0, "on a wheelie bin" 1 to 2. The audit now calls two cars on one boulevard out in the lane by about 60 cm, which looks like its lane model, not the cars.

Plain English

TermWhat it means
navmeshAn invisible map of walkable ground that characters use to work out routes. No navmesh, no walking.
nav islandA patch of walkable ground the pathfinder cannot connect to the rest of the map, usually because the only way onto it is a ledge taller than a walker may step. People can stand on it and nobody can walk there.
partial pathA route that gets as near as the pathfinder can manage and then stops short of the goal. The walker sets off, arrives at the end of it and stands there.
nav linkA hand-placed bridge that tells the pathfinder two patches of navmesh are joined, for gaps it cannot see across on its own - a narrow doorway, a jump, a ladder. Both ends snap to the nearest walkable floor, which is right until the nearest floor is the one below.
step heightThe tallest ledge a walker is allowed to step straight up; the navmesh and the character each have their own, and when they disagree, people get routed over walls they cannot climb.
VRAMMemory on the graphics card. This project has 8 GB of it, and that ceiling shapes most of the decisions in the devlog.
game threadThe part of the engine that runs the game's own logic - every Blueprint, every tick - one thing after another. If it takes 90 milliseconds, nothing else matters: the frame cannot finish sooner.
tickCode that runs every single frame. Cheap once, ruinous sixty times a second across a thousand actors.
standaloneRunning the game on its own with the editor closed, the way a player would. The only honest place to measure frame rate, because the editor eats memory and processor time of its own.
gap buildOne numbered, self-contained batch of C++ changes to the town's code, prepared and checked offline, then compiled into the game in a single build that backs itself up and undoes itself if it fails.

Things we still need to fix tomorrow:

  • Play the bin round once with the lorry throttle on, and wire in the nearby-bins lookup.
  • Find why a released hair groom does not come back at the low setting, then try the unload again.
  • Look at the hotel paintings, the gym turf lines and the river texture in the game, after the texture changes.
  • The taxis react to police within 60 m. James decides if it should be half a mile.
  • Steps for the other shops: the laundrette needs a fresh measurement.
  • Club stills on a Thursday to Saturday night, when the floor is not empty.
  • Check the audit's lane model against the kerb on the boulevard where two cars read as blocking.

← All devlog entries

Watch it get built. All of this goes up on YouTube as it happens - broken animations, buildings hovering a foot off the ground, the lot.

Subscribe on YouTube