A rendered shot plays back jerky and looks like a low frame rate in Unreal Engine 5.8
Twelve seconds of a man in a cab
Second Chance has a bin round in it. You come out of prison, you sign on, and one of the things on the board is a loader's job with the council. Before your first shift somebody sits you down at the depot and puts an induction film on the telly on the wall.
That is a deliberate choice and it is worth saying why. There are no cut scenes in this game. The player is never taken off the controls and shown something. So the induction is not a cinematic — it is a film, playing on a television, in a room you walked into and can walk out of. If you want to stand up halfway through and go and look at the yard, nobody stops you.
The man in the film is Wozza. He drives the wagon, he is full of banter, and in this module he is on screen for twelve seconds answering two questions in a vox pop. He matters more later — if the player takes the fly-tipping collection job he is in the cab beside you for most of it.

Twelve seconds of screen time cost most of a week of evenings. MetaHuman work is the single biggest consumer of time on this project and it is not close.
James's X feed at the moment is full of people picking over every detail of GTA 6 — the way a character's hand meets a door handle, where a foot lands on a kerb. That is the standard being applied to a studio with thousands of staff and a November release date, and it is the same standard people will apply here. So the angle a wheelie bin sits at while it is being pushed has to be right, and so does the way a driver's fingers rest on the rim of a wheel.
It was a Monday. He had been to the gym after work and run on the treadmill, watching his heart rate on a watch he had bought a few days earlier. He was at the desk by about eight.
One other thing about that Monday, since anybody who has read these before will have noticed the devlog changed shape at the weekend. It used to be written in the first person and now it is not. That came out of a novel his mum is reading — Tomorrow, and Tomorrow, and Tomorrow by Gabrielle Zevin, which by coincidence turns out to be about two people making games. He went through what readers love about it and what critics complained about, took the complaints as instructions, and had the whole thing rebuilt in an East Midlands register the book has nothing to do with. It is not a copy of it. But if you like reading this, you will probably like that, so there is the title.
The fingers that were not moving
The beat needs Wozza waiting. He has been asked a question off-camera and he is listening to it, one hand on the wheel, drumming his fingers. James found a Mixamo clip called Dice Idle whose entire performance is exactly that — a left-hand finger tap by somebody who has been kept waiting — and it came in cleanly on the shared skeleton.
The retarget onto Wozza's body reported success. The clip had the right frame count and the right duration. Every finger in it was at 0.00 degrees.
Nothing raised an error, and the retarget script's own guard on static output passed, because that guard samples the pelvis, the spine and the limbs — all of which had come through perfectly. A clip whose whole performance lives in an unchained subtree sails past every check in the file. James saw it on the first render and said the fingers were not moving, that what was there was just his breathing. He was right; the residue was the driving Anim Blueprint's idle.
The cause was that the arm chains stopped at the wrist, so every finger bone sat outside every chain and none of it retargeted. Ten finger chains later, index_01_l reads 42.78 degrees against a source of 43.29.
The measurement nearly went wrong on the way in, too. The first check compared the clip at t=0 against t=4.5 and read 0.00001 degrees on the source, which very nearly proved the download was empty. The tap is cyclic and both samples had landed on the same phase of it. Two samples is not a measurement.
Then the fixed clip was on the character and still nothing tapped, because the AnimGraph was playing the plain driving pose and nothing in it referenced the tap at all. Retargeted is not wired. That one sentence would have saved an hour.
Wiring it took a layered blend filtered to the four finger bones and nothing else. Filtering one joint higher, at the wrist, twists his hand off the rim — the two clips' wrist rotations differ by 27.5 degrees of roll, a number James called as 28 by eye off the screen before anybody measured it. He has since decided the finger tap is Wozza's impatient tell and should turn up wherever he is kept waiting, which is a nicer outcome than a fixed bug.
Four wrong answers in twelve minutes
The watch had him Relaxed all the way through the working day, lifting around three, Moderate from five, and High between nine and ten in the evening. That hour was the peak of his whole day and it is the hour worth writing down.
It started with the editor being unreachable for six minutes behind a World Partition commandlet that was still chewing on the map. Then the tap-not-wired discovery. Then, between about a quarter to ten and ten, a run of test renders that came out wrong in a way nobody could name.
Four explanations in a row, and every one of them was wrong. The cab was not lit. It was; the lights were there. The camera was near-profile. It was not. The crop was bad. The crop was fine. Something was off with a tick flag. It was not that either.
What it actually was: the Anim Blueprint was dirty and had not been recompiled, so the graph was not evaluating at all and the character rendered in his reference pose — stood up through the roof of the cab with his arms hanging by his sides. It had been marked dirty by the agent reading properties off the graph, four times, because the read goes through a write call that marks the asset changed even when the value it writes back is byte-identical to the one already there. Nothing errored and nothing logged.
The fastest tell turned out to be mirror-symmetric hands. The left hand read 48.2, 14.66, 103.48 and the right read −48.22, 14.65, 103.44 — same height, same depth, mirrored across. No driving clip is symmetric. Two hands in perfect mirror is the rest pose.
The expensive part was not the twelve minutes. Halfway through, a yaw sweep was rendered to work out where the head was pointing, and it showed the head barely responding and turning the wrong way — which read as solid proof that the solved head angles were wrong and that the documented forward axis was a lie. Both were correct all along. The sweep had been rendered against the dead graph. Recompiled, the same sweep put −47.086 degrees straight down the lens, exactly as the geometry had predicted.
The render is ground truth only holds if the thing being rendered is actually running.
He wrote up what he was seeing at about ten past ten, in the middle of the worst of it. The note was flat and specific and ended with a compliment about the voiceover, and read exactly like the ones he had written at lunchtime.
It was not the frame rate
By half ten there was a cut to watch. He watched it and said it played back very jerky and seemed like a very low frame rate, despite having been rendered frame by frame — and could the inside of the cab be about twice as bright next time, with a light from above the lens as though it were filmed properly.
The frame rate was never the problem. Twenty-five frames a second on a locked-off talking head is fine. Five things were wrong at once, and four of them are invisible if you pause on a still.
The big one: for the three and a half seconds while he listens to the question, his face was a photograph. Zero blinks across 197 consecutive frames, and an iris that never moved. The listening pose is deliberately held on one frame of a montage, and the montage slot overrides the blink idle in the shared face Blueprint — so the held pose held the eyelids too. A face that sits perfectly still for three and a half seconds does not read as a stiff performance. It reads as the picture having stopped, and the eye reports that as a frame rate.

The clean repair is to move the blink blend downstream of the montage slot and put it on the film clock. That is still the right fix and it has not been done, because the face Blueprint is shared — the police intro runs on it — and a dirty one renders the reference pose, which is the thing that had just eaten an hour. So the shot got a baked listening clip instead: blink curves, with his held expression written into the other 258 curves as constants. It plays through the same proven path and it reverts by changing one number.
The double blink lands at 2.27 and 2.87 seconds, which is not arbitrary either — it puts both blinks inside her question and leaves 0.44 seconds of clear air before the cut, so neither one is chopped in half.
The other three: the render was boiling, with every frame putting out a different speckle over his skin — two grabs of the same camera with the pose frozen still differed by 2.6 levels across the head. The shutter was covering only 37 per cent of each frame's movement, which is what makes a head turn strobe. And the cut ended four frames short, mid-whip, because ffmpeg's -shortest had turned a ten-millisecond mismatch into a sixth of a second.
A picture nobody would ever see
The fifth one is the one worth the most.
The shot has a colour grade on it — a gain and a lift — applied on the way into the finished film. The tool that cuts the little review mp4 went straight from the flat frames to ffmpeg and never applied it. So the cut he had been calling still quite dim was 1.62 times darker than the same frames in the film, and so was every review cut ever made on this project.
Which also means the lighting ladder that had settled the cab lights a few evenings earlier had been judged on that same wrong picture.

The lighting maths did not behave either. Doubling the whole rig moved the face from 42.7 to 53.8 — twenty-six per cent, not a hundred, because the sun through the windscreen is a fixed floor that the cab lights only add to. Scaling everything to four or five times clipped the face solid white and the cab was still black, because the key light only lights his face. What un-dims a cab is holding the key where it is and pushing the fill and the bounce, with their radii widened so they actually reach the door and the seat. The fill ended up at five times its old value, and that is the fix rather than a slip.
The top light he asked for went on the lens axis, 70 cm back and 38 cm up. The 38 is clearance, not taste: the cab roof is at 254.1 and his head socket at 199.3, so there are 54.8 cm to play with, and at +50 the panel is inside the roof and shadows itself off.
One more trap, and it cost more than it should have. The scene warms up. The identical quality preset scored 1.635 on its first pass in a session, 1.026 on the second and 0.735 on the third as the various caches filled — so an A/B comparison spread across two runs measures the caches, not the setting. Every ladder now shoots its control again at the end of the same run.
The finished thing is 1,040 renders in 53 minutes, assembled into 260 frames of 30 fps video at 8.667 seconds — which is exactly the length of the voiceover, so the tail head turn plays to its stop. Graded face level 122.8, against 38.5 before. The cab reads 30.1 against 3.8.
What an evening costs
Earlier the same evening, before any of the film work, the token tracker went live on the website. It reads the session transcripts, works out which part of the game each stretch of work belongs to, and puts the totals on a public page: 509 million new tokens, 589 agent hours against 252 hours of his own, 1,674 prompts typed, over 26 days on record.

It was audited by a dozen agents set on it adversarially, after it already rendered correctly, and they found six defects — including one that overstated the agent hours by five per cent and one that would have double-counted a whole day the next time the work categories were edited. The scan itself went from four minutes to one, by testing whether a pattern's literal text appears in the string at all before running the regular expression over 25 MB of it. Proven equivalent over 9,641 real cases, no differences.
589 hours against 252 is the honest shape of the thing. Rockstar have a floor of animators for a twelve-second vox pop. He has that ratio and a Monday evening.
The film is still not in the game. The room it plays in has not been built, and the other nine shots in the module are all still at 25 fps, which means none of them can be cut together with the one that now works.
The fault
A rendered animation plays back jerky and looks like a low frame rate in Unreal Engine 5.8
Every frame rendered individually to disk, assembled at 25 fps, and it reads as roughly half that. Five faults, stacked, four invisible in a still frame:
| # | What | How it was found |
|---|---|---|
| 1 | Zero blinks across 197 frames — the face is a photograph for 43% of the shot | A held montage pose overrides the blink idle in the face Anim Blueprint |
| 2 | The render boils — a different speckle over the skin every frame | Two grabs of the same camera with the pose frozen differ by 2.6 mean-abs across the head. That is not animation |
| 3 | Shutter covers only 37% of each frame's motion, so head turns strobe | 4.10° of smear inside an 11.06° step |
| 4 | The cut ends four frames early, mid-movement | ffmpeg -shortest turned a 10 ms audio/video mismatch into 160 ms |
| 5 | The review cut was never colour graded | The film applies gain 1.62 / lift 14; the review tool went flat frames straight to ffmpeg |
A still face does not read as a stiff performance. It reads as the picture having stopped.
The fix
Bake the blink curves into the held pose, and grade the review cut through the same path as the film
The clean repair for (1) is to move the blink blend downstream of the montage slot and put it on explicit film time. That was not done, because the face Anim Blueprint is shared with another scene and a dirty Anim Blueprint renders the reference pose. Instead the held expression was baked into a duplicate of the blink idle as 258 constant curves, so the blinks survive and the pose does not move. One constant reverts it.
(2) higher sample counts — which came out 2.8× faster as well as 3.4× cleaner. (3) shutter 0.5 → 0.75. (4) pin the duration and pad the audio instead of truncating. (5) the review cutter now imports the grade from the film's own module rather than keeping a copy, so the two cannot drift.
The guard: a review cut must go through the same grade as the film, or the review is of a picture nobody will ever see. And when comparing two render settings, shoot the control again at the end of the same run — the scene warms up, and the identical preset scored 1.635 / 1.026 / 0.735 across three passes as the caches filled.
The fault
A retargeted animation comes back with every finger at 0.00 degrees and nothing errors
Correct frame count, correct duration, body and limbs perfect, fingers dead. The arm chains ended at the wrist, so every finger bone was outside every chain. The retarget script's own static-output guard samples pelvis, spine and limbs — all of which retargeted fine — so a clip whose entire performance is a finger tap passes every check in the file.
Two related traps in the same hour:
- Comparing the clip at two time samples read 0.00001° on the source, which nearly proved
the download was empty. The tap is cyclic and both samples hit the same phase.
- With the chains fixed, still nothing tapped: the AnimGraph had never referenced the clip.
Retargeted is not wired.
The fix
Add finger leaf chains, verify the bones the clip actually animates, and read the AnimGraph
Ten finger chains added as leaves, named to match so the automatic mapping binds one to one. Leaf chains leave the body solve unchanged, and a source with no finger animation still retargets zero through them. index_01_l 0.00 → 42.78 against a source of 43.29.
The guard: verify the bones the clip animates, not a fixed probe list — and scan every frame for the range rather than sampling two. Then open the AnimGraph and confirm something plays it.
The fault
A MetaHuman renders in the reference pose after a property is read from its Anim Blueprint
The character rendered stood upright through the roof of the vehicle with his arms by his sides. animation_mode still said Animation Blueprint and the class was still set, so it did not look like the failure it impersonates. The cause is that reading a property off an AnimGraph node goes through a write, which marks the Blueprint dirty even when the value written is identical to the one already there. Until it recompiles, the graph does not evaluate. Nothing errors and nothing logs.
Worse than the pose: evidence gathered against the dead graph looked like solid proof of two other things. A head yaw sweep showed the head barely responding and turning the wrong way, which read as proof that the solved angles were wrong and the documented forward axis was a lie. Both were correct.
The fix
Check the compile status before believing a render that contradicts a measurement
The staging script now recompiles and asserts the status is up to date before any capture.
The fastest tell, if you are already looking at a bad frame: mirror-symmetric hands. Left hand 48.2, 14.66, 103.48 against right hand −48.22, 14.65, 103.44 — same height, same depth, mirrored across. No driving clip is symmetric; two hands in perfect mirror is the rest pose. Pelvis-to-foot distance corroborates it: 81.6 for standing against roughly 55 for seated.
The guard: the render is ground truth only holds if the thing being rendered is running.
The kit
| Tool | Why this one |
|---|---|
| Unreal Engine 5.8 | where the shot is rendered, frame by frame, from the editor |
| Mixamo | the finger-tap clip; a free library clip retargeted onto a MetaHuman |
| ffmpeg | assembling the plates and muxing the voice track. Also the source of fault 4 |
| ElevenLabs | Wozza's voice — the same custom voice does the satnav |
| A watch | it caught the hour, which was not the hour anybody would have guessed |
Plain English
| Term | What it means |
|---|---|
| retargeting | Taking an animation made for one character and making it work on a differently proportioned one. |
| animation blueprint | The logic deciding which animation a character plays and how one blends into the next. |
| layered blend | Playing one animation over another on named bones only — a hand gesture on top of a walk, with the legs left alone. |
| reference pose | The neutral stance a character model is built in, before any animation is applied. Seeing it in a finished shot means the animation is not running at all. |
| skeleton | The hierarchy of bones inside an animated model. Two models sharing a skeleton can share animation. |
| plate | A single rendered frame written out to disk, to be assembled into a film later. A minute of film is fifteen hundred of them. |
| colour grade | A colour and brightness adjustment laid over a finished image. Judging lighting on an ungraded picture is judging something the audience will never see. |
| shutter angle | How much of each frame's worth of movement is smeared into that frame, borrowed from film cameras. Too little and fast motion strobes; too much and it turns to soup. |
| MetaHuman | Epic's system for realistic human characters — face, body, hair and clothing, ready to animate. Every named person in the game is one. |
| commandlet | A job run against the project with no editor window open — used for bulk work and overnight processing. |
| World Partition | Unreal's system for very large maps. It chops the world into a grid and only loads the squares near the player. |
Things we still need to fix tomorrow:
- The other nine shots in the module are still at 25 fps and at the old quality preset, so
they cannot be cut together with the one that now works. That is about four hours of rendering.
- The blink idle is still on the wall clock for every other character. The baked clip routes
around it for one shot; it does not fix it.
- The listening expression now reads as a fixed open-mouthed smile for the whole of her
question, because it is finally lit well enough to see. That is a judgement call and it is waiting on James.
- The classroom at the depot has been scoped and scripted and not built. The office door it
would go behind currently opens onto a four-metre drop.
- The films are not in the game, have not been rendered since the re-cut, and have never been
watched with sound.
- Neither of them has a video on YouTube yet, and neither does the bin round. The building
keeps winning.