Skip to main content
Procedural Motion Systems

What to Fix First When Procedural Blends Produce Unintended Sub-Frame Phase Locking

You're scrubbing through a blend tree and something feels off. The motion looks fine at whole frames, but there's a subtle judder—almost like the bones are fighting each other in between. That's unwanted sub-frame phase locking. It's not a bug in the engine; it's a signal that your blend weights and update order are misaligned. Let's fix the most likely culprit first. Who Decides and When: The Decision Frame Who Owns the Problem—Animator or Engineer? The worst meeting I ever sat through started with a producer asking, “So who’s supposed to fix the phase locking?” Silence. The technical animator pointed at the gameplay engineer. The engineer pointed back. That ping-pong cost the team two weeks. The truth is blunt: the decision about sub-frame phase locking must land on one person, and that person is usually the technical animator—if the root cause sits in blend-tree logic, weight interpolation, or clip alignment.

You're scrubbing through a blend tree and something feels off. The motion looks fine at whole frames, but there's a subtle judder—almost like the bones are fighting each other in between. That's unwanted sub-frame phase locking. It's not a bug in the engine; it's a signal that your blend weights and update order are misaligned. Let's fix the most likely culprit first.

Who Decides and When: The Decision Frame

Who Owns the Problem—Animator or Engineer?

The worst meeting I ever sat through started with a producer asking, “So who’s supposed to fix the phase locking?” Silence. The technical animator pointed at the gameplay engineer. The engineer pointed back. That ping-pong cost the team two weeks. The truth is blunt: the decision about sub-frame phase locking must land on one person, and that person is usually the technical animator—if the root cause sits in blend-tree logic, weight interpolation, or clip alignment. If the locking emerges from how physics reads the output transform, the gameplay engineer takes it. The trap is assuming both roles can fix it concurrently. They can’t. The blend logic and the physics hook are built on different clocks, and chasing the symptom from the wrong side doubles the debugging surface.

The Clock Is Ticking—Right Before Physics Integration

The decision can't wait until the animation system is wired into the character controller. I have seen teams push this diagnosis to the “polish phase” and then watch a single locked hip rotation corrupt an entire ragdoll cascade. That hurts. The fix window sits squarely between the moment your blend tree passes unit tests and the moment it first feeds a physics-driven bone. Most teams skip this: they verify poses in isolation, then merge into the full engine and blame the physics solver when the seam blows out. Wrong order. You test for phase locking before physics touches the data, because once the solver starts filtering or extrapolating, the original blend error hides behind a layer of damping. You lose the ability to see the raw sub-frame glitch.

The catch is that pre-physics testing feels slower. Engineers want to see the character move, not stare at debug overlays. But delaying the diagnosis by even one sprint means every procedural blend that follows gets built on a broken foundation. A locked sub-frame offset at foot-plant, for instance, will later produce a ground-penetration error that the physics engine can’t fix—it can only mask it. The cost of delaying? You rebuild the blend tree twice: once after physics integration reveals the problem, and again when the fix breaks something downstream. That’s a month, easily.

“A locked sub-frame phase looks like a physics bug until you strip away the physics. By then, your schedule is already red.”

— lead technical animator, internal post-mortem, 2023

What Breaks When You Hesitate

Phase locking is subtle. It doesn’t crash the build. It makes the character’s left foot stick a hair longer on one side during a walk cycle. Players won’t name it, but they’ll feel the floatiness. The real damage, however, is to future work: every procedural layer you stack on top—stride adaptation, slope alignment, momentum blending—will inherit that locked offset. By week three, you have a system that technically runs but produces a collective body lean that no single clip contains. And because the error lives inside the blend weight curve, not the animation clip itself, normal debugging tools miss it. You end up tweaking animation keys that were never wrong.

The fix path narrows fast. If you wait until the physics integration is complete, your only options become force-based corrections (expensive) or ad-hoc overrides that break character consistency. That sounds fine until the next locomotion feature requires every blend to re-verify against the same old phase offset. Then you patch the patch. I have seen a project spend six months layering workarounds on top of a two-day fix that should have happened before the first physics hook. Not yet. Do it now.

Three Approaches to Diagnose Phase Locking

Oscilloscope logging of blend weights over time

Most teams skip this: they tune blends by eyeballing the character and hoping. That works—until it doesn't. The first real diagnostic tool is a live oscilloscope trace of your blend weights, sampled at the engine's tick rate. Capture the raw interpolation curve for each affected animation channel across a few hundred frames. What you're looking for is micro-oscillation—tiny, rhythmic dips and surges in the weight values that occur below the display refresh rate. The catch is that logging itself can introduce latency, so you need a tight buffer, maybe 200–500ms of history, written to a ring buffer before being flushed to disk. I have seen teams waste two weeks chasing a phantom phase lock that turned out to be the logging tool's own sampling jitter. Pro: you see the exact sub-frame behavior. Con: you need a developer build with profiling hooks, and the data volume can overwhelm a non‑technical animator.

Frame-by-frame playback with visual markers

Cheaper. Slower. Sometimes more honest. Export a 2–3 second clip of the problematic motion and step through it at half-speed or single-frame increments. Overlay a simple visual marker on the skeleton—a bright dot on the hip bone, a colored line from shoulder to elbow—and watch how its position shifts between frames. What usually breaks first is the relative offset between two bones that should move smoothly together. The tricky bit is that a visual inspection only catches phase locking when the amplitude of the error is large. Sub-millimeter jitter? You will miss it. That said, this method requires no specialized tools beyond a sequencer that can pause and cue. I once fixed a root-slide issue by watching a single forearm marker drift by two pixels every fourth frame—a pattern I never would have spotted in a spreadsheet of blend weights. Pro: immediate, tactile, no coding needed. Con: you need a human with patience and decent eyesight.

Statistical deviation checks on bone orientations

Run the blend through a batch process and collect the orientation angles (quaternions or euler, pick your poison) for every bone in every frame. Then compute the standard deviation of those angles across a sliding window of, say, five frames. A sudden spike in deviation—a narrow peak over 1–2 frames—points to a sub-frame phase reset. The statistical approach is brutal: it catches locking events that appear once every 40 frames and last only a single tick. Wrong order? You get a false positive from foot-sliding or weapon recoil. The fix is to threshold the deviation against the character's resting tremor—a baseline you measure during a neutral pose loop. Pro: automated, repeatable, can flag problems in a 10,000-frame sequence overnight. Con: you must tune the window size and threshold per character, or you drown in noise.

'The statistical check told us the left elbow was phase-locked to the right hip, but only when the blend weight crossed 0.65. We never saw it on screen.'

— Technical animator at a mid-size studio, recalling a build review

Odd bit about animation: the dull step fails first.

Odd bit about animation: the dull step fails first.

Each method catches a different slice of the problem. The oscilloscope reveals the waveform shape. Frame-by-frame preserves the spatial context. Statistical deviation scales to large data sets. None of them are perfect. Which one you pick depends on the next question: how much time do you have, and how bad does the lock look on screen? That's the decision the next chapter lays out—but if you're reading this and have not yet seen the problem in motion, start with the visual markers. A two-minute playback costs almost nothing. Wrong answer? You lose a day. Right answer? You save three.

How to Choose the Right Diagnostic Criteria

Measuring sub-frame deviation vs whole-frame jitter

Most teams skip this: they stare at whole-frame jitter—visible stutter on screen—then immediately start tweaking blend weights. That’s usually wasted effort. The real culprit hides inside a single frame. Sub-frame deviation means your procedural motion system produces a pose that belongs to frame n and frame n+1 simultaneously, split across different bones. The character looks disjointed, but no frame-to-frame timing error exists. I have seen teams burn two weeks rewriting interpolation logic when the actual fix was clamping blend normalization at 0.5 thresholds. The diagnostic rule: isolate one bone channel, plot its value across 16 consecutive frames, then check whether the discontinuity lands between integer frame boundaries. If yes, you have sub-frame phase locking—whole-frame jitter shows a different signature, raw position spikes at frame edges.

The catch is that sub-frame deviation rarely triggers profiling alarms. Engines report smooth 60 fps, but artists complain about “that weird twitch in the elbow.” You need to capture raw animation data, not just watch the playblast. We fixed this once by printing quaternion dot products per joint per sub-step—suddenly we saw three bones snap to a different blend state at sub-frame tick 0.7 while the rest stayed on schedule. Wrong order. Not yet. That hurts. Whole-frame jitter is easy, sub-frame phase locking is insidious—and requires different diagnostic criteria.

Prioritizing blend weight normalization

Blend weight normalization sounds like a checkbox—it's not. When procedural blends produce unintended phase locking, the first question should be: do all blend weights sum to exactly 1.0 at every sub-frame step? If the answer is “approximately,” you have a problem. Unnormalized weights create a floating offset that shifts the blend result toward one source motion asymmetrically, frame by frame. That asymmetry builds until the system locks onto the wrong phase boundary—usually at transition points between idle and walk cycles. The trade-off is plain: normalization costs per-bone math, but skipping it costs visual reliability across blend trees.

Most engine defaults normalize once per pose, not per sub-step. That's the trap. I have fixed exactly this by moving normalization into the interpolation loop—every blend operation recalculates weights before applying LERP or SLERP. Performance hit was ~3% on a mid-range mobile GPU. Worth it. Don't trust per-pose normalization when your blend tree has more than three sources; the error compounds. The diagnostic criterion: pick a motion clip with two active blends, disable normalization, record the deviation over 200 frames. If the drift exceeds 0.03 normalized, fix normalization first—don't touch interpolation order yet.

Checking interpolation order (LERP vs SLERP)

Interpolation order is the third criterion, not the first—but teams jump to it because it sounds technical. The reality: LERP (linear interpolation) on rotations can cause unwanted acceleration through the blend, amplifying phase misalignment. SLERP (spherical linear interpolation) preserves constant angular velocity, which reduces the chance that sub-frame timing mismatches grow into locking. However, SLERP costs more and can introduce gimbal-like behavior if you mix it with non-uniform bone chains. So where do you draw the line?

If the locked phase shows up in orientation bones (shoulder, hip, spine), check SLERP availability first—if absent, normalize weights before you patch the engine.

— practical rule from debugging three production blend trees

The tricky bit is that a pure SLERP swap without weight normalization often masks the symptom without fixing the root cause. We saw a case where SLERP reduced the visible lock from 12 frames to 3—but the seam blew out at extreme blend values above 0.8. That's a normalization failure, not an interpolation failure. The diagnostic criterion: run the same blend test with LERP, then SLERP, both with normalized weights. If the lock persists only under LERP, your fix is interpolation order. If it persists under both, you skipped step one—sub-frame deviation measurement. Most teams do.

Trade-Offs: What Each Fix Costs

Performance vs memory trade-off in logging

Log everything and you can replay any glitch. But logging every transform, every blend weight, every sub-frame tick across 30+ bones—that eats memory like a teenager raiding a fridge. I have seen builds where the logging buffer alone consumed 400 MB. For a debug feature. The trade-off is brutal: fine-grained logs give you the exact moment phase locking starts, but they crater your frame rate and, worse, mask the bug you're chasing—performance logging alters timings, which can hide the sub-frame slip you need to see. The fix? Sample, don't stream. Log every 10th frame during suspected lock windows, keep a rotating ring buffer (last 200 frames only), and accept that you might miss one-off events. That hurts, but not as much as shipping a log-saturated build that passes QA then phases out on live data.

Accuracy vs simplicity in frame-by-frame analysis

Frame-by-frame stepping is the gold standard—pause, inspect each blend node, see exactly where the phase crossed zero. The catch: it takes forever. For a single walk cycle that lasts 48 frames, stepping through each sub-frame increment (and there are usually 4–8 per visual frame) means 384 manual checks. Most teams skip this. They eyeball the final animation, see it looks "close enough," ship it, and three months later the procedural system blows up under load. The trade-off is direct: accuracy costs engineering time, and simplicity costs accuracy. What usually breaks first is the engineer's patience. But here is the reality check—you only need micro-stepping once. Map the exact offending blend node, log its index, then automate the check. One day of manual torture saves three days of speculative hotfixes.

“We spent six hours stepping through a single blend that looked wrong. Found the error in frame 37, sub-step 3. The fix was one coefficient change. Worth every minute.”

— technical animation lead, 2023

Honestly — most animation posts skip this.

Honestly — most animation posts skip this.

Engineering time vs runtime overhead

The third axis is the one nobody talks about at kickoff. You can offload phase detection to a background thread—no frame hit, but now you're debugging timing issues in two threads. That's hell. Or you can keep it synchronous, pay the 0.2 ms per frame, and finish the project on schedule. The odd part is—most teams pick runtime overhead because it's predictable, but they forget to budget for it. The 0.2 ms you ignore becomes 6 ms under heavy particle loads during a boss fight. That single procedural blend then tanks your 60-fps target. The real trade-off is not technical; it's organizational. Short-term engineering time (building a robust but slower diagnostic) beats long-term runtime drag (a fast check that breaks in production). Wrong order? Absolutely. I have seen it flip projects. Fix first on the timeline, not in the code—your future self hates debugging at 2 AM for a phase lock you could have caught with 12 extra milliseconds per frame.

Step-by-Step Fix After Diagnosis

Reorder blend nodes in the blend tree

Most teams skip this step — they hunt for code bugs first. But before you touch a single weight variable, open your blend tree and look at node order. I have seen a six-hour debugging session end in thirty seconds by moving a single blend node two slots down. The rule is simple: evaluate deterministic inputs before variable ones. If a locomotion blend sits above an additive reaction layer, the sub-frame phase lock often vanishes — the deterministic base fixes the timing reference. The odd part is — most visual tools hide this ordering problem behind pretty graphs. Drag the base pose node to the top of the evaluation stack. Then add the procedural modifier below it. Test.

What usually breaks first is a node that samples the same pose twice within a single frame — two overlapping blend trees fighting for the same bone chain. Reorder before you rewrite. That fix costs nothing but drag-and-drop time. The catch? You might discover your entire blend architecture was built upside down. Fine. That's cheaper than patching weight logic for three days.

“The node order you shipped with is rarely the order that works. Respect evaluation priority before you touch math.”

— motion lead, after a 2 AM rollback

Adjust update frequency of blend weights

Now the subtle one. Your blend weights might update at the wrong rate — every anim tick when they should sample once per render frame, or vice versa. Weight jitter at sub-frame intervals creates exactly the phase-lock illusion; the motion looks stable in timeline view but snaps in-game. You can fix this by pushing weight updates to the LateUpdate phase or locking them to a fixed-timestep callback. The trade-off hits here: faster updates improve responsiveness but reintroduce phase drift under load. We fixed this on a prototype by capping blend-weight recalculation to 30 Hz while the animation system ran at 60 Hz. Phase lock disappeared. The movement felt slightly heavier — players adapted in two minutes. Your users will too.

That said, don't blindly match blend updates to the frame rate. Match them to the slowest stable signal in your procedural chain. A root motion curve updating at 20 Hz can't drive a blend system that recalculates every frame — you're amplifying noise. Instead, sample the blend weight at the same interval as your lowest-fidelity input. Boring fix. Works every time.

Apply weight normalization before interpolation

Here is where the math lies in wait. Unnormalized blend weights — they sum to 0.8 or 1.3 instead of 1.0 — cause sub-frame phase locking because the interpolation algorithm can't distribute motion correctly across the skeleton. The fix is a one-liner: divide each weight by the total sum before feeding it into the blend. But do this at the last possible moment, not earlier. Normalizing too early distorts partial updates and produces a different class of drift — hard to diagnose, easy to blame on phase locking.

Most engines expose a NormalizeWeights flag. Flip it. If your system doesn't have one, add a 5-line preprocessor in the blend evaluation function. That's the cheapest insurance against an entire class of phase errors. The pitfall: if you also reorder nodes or change update frequency, the normalization step may mask a deeper ordering bug. So apply normalization after the first two fixes, not before. I once watched a team normalize weights on Monday, declared victory on Tuesday, and found phase lock returning on Thursday — because the blend-tree order was still reversed. Fix order matters. Start with node order, then update rate, then normalization. Not the opposite.

Risks of Getting It Wrong

Misidentifying phase locking as blending lag

The most common mistake I see is a team staring at a sub-frame stutter and blaming blend weights for being too slow. They crank up interpolation speed—bad move. What looked like lag was actually two animations locking phase at 13.7ms intervals, not a sluggish crossfade. The fix for blending lag (shorter blend windows, higher priority on the incoming clip) makes phase locking worse because it forces the solver to commit to a bad alignment faster. One studio lost three days tuning blend durations, chasing a ghost. When they finally ran a phase histogram, the pattern was obvious: peaks every 30 frames, right on the sub-frame boundary. Wrong diagnosis cost them a sprint.

The odd part is—phase locking artifacts often disappear when you lower the blend rate. Counterintuitive, but true. Slower blends give the motion matching system more time to find a non-locked candidate before the transition finishes. That’s not a general rule, but it’s a useful litmus test: if reducing blend speed cleans up the jitter, you’ve got a phase problem, not a lag problem.

Overcorrecting and introducing new artifacts

Suppose you do find the phase lock. The temptation is to nuke it with aggressive decoupling—forcing every bone to desync its sub-frame cycle. That hurts. Root motion integration shatters because the solver no longer respects the momentum of the pelvis. I watched a character’s feet skate seven centimeters per stride after a dev set sub-frame decoupling to maximum. The visual fix for the lock was a smooth loop. The cost? A floating, untethered gait that looked worse than the original stutter. The trade-off here is brutal: perfect phase freedom versus believable foot contact.

What usually breaks first is the hip trajectory. With overcorrection, the pelvis bobs at a different frequency than the feet. The brain catches that mismatch instantly. Players describe it as “the character feels light” or “like walking on a trampoline.” That’s not a feel issue—it’s a mathematical consequence of killing phase constraints without rebuilding the root motion pipeline. Most teams skip this: they fix the phase lock, see no jitter, and ship it. Three weeks later, QA logs a constant complaint about floaty movement. That ship costs more than the original bug.

Flag this for animation: shortcuts cost a day.

Flag this for animation: shortcuts cost a day.

Ignoring root motion integration issues

Phase locking isn’t always in the blend tree. Sometimes it lives in the root motion integrator. The solver aligns sub-frame phases perfectly for the upper body, but the root translation still uses a fixed time step that drifts against the animation’s internal clock. The result? A clean pose blend that slides on the ground. I have fixed exactly this type of bug by shifting the root update from fixed timestep to the animation clock domain—no blend changes at all. But if you treat every phase lock as a blend problem, you’ll never check the integrator.

‘We rewrote our blend system twice before realizing the root was just interpolating on a different ticker.’

— Senior technical animator, post-mortem on a shipped title

The consequence of skipping this check is subtle: your motion looks correct in isolation but falls apart in crowds or slopes. The lock is real, but its source is a misaligned update loop, not a bad pose selection. Fix the wrong layer and you introduce a 2–3 frame latency on all root motion, which then cascades into contact point errors. One misdiagnosis, three new bugs. The catch is that root integration issues don't show up on standard phase heatmaps—you need to plot root position delta against animation time stamp, not blend weight. That requires a separate diagnostic pass. Most teams don’t have it, so they patch the visible symptom and carry the hidden cost through the entire project.

Frequently Asked Questions

Is sub-frame phase locking ever desirable?

Yes—but rarely for the reason it happens. I have seen teams accidentally rely on phase-locked sub-frames to hide a broken transition curve, then call it 'intentional.' That's not design; that's a crutch. The only legitimate case I know of is a deliberately mechanical rhythm—think of a heavy door that must catch on every frame, or a stomp attack where the foot *must* reach the ground at sub-frame precision. Even then, you're better off coding that as a hard event, not letting a blend system guess. The pitfall: once you accept phase locking as a feature, you stop looking for the root cause—and the next blend breaks differently.

What usually breaks first is the assumption that desynchronization is always bad. Wrong order. Sometimes a procedural motion system *needs* a tiny phase offset to feel organic—a hand that reaches slightly behind the spine, a foot that lands a few milliseconds after the hip rotates. The catch is that phase locking is symmetric: both limbs lock to the *same* phantom beat. That symmetry kills the natural asymmetry your eyes expect. So ask yourself: does this 'desirable' lock actually serve the motion, or does it just make the math look clean on paper?

Does Unity handle this differently than Unreal?

Fundamentally, no—both engines evaluate animation graphs per-frame and blend on bone transforms. The engine-specific traps show up elsewhere. Unity’s Animator tends to hide sub-frame drift inside state transitions if you use Exit Time with small thresholds; I have debugged a case where a 0.01-second offset caused a two-frame phase slip that looked like a stutter. Unreal’s Blend Space and Layered Per Bone Blend, by contrast, accumulate phase error when you blend multiple poses that have mismatched root motions. The odd part is that neither engine warns you—it just looks 'off.'

The practical fix differs: in Unity, clamp your transition durations to whole-frame multiples (e.g., 0.033s for 30 fps) or use FixedUpdate driven by a manual timer. In Unreal, break your blend inputs into explicit sync groups—don't rely on the automatic Sync Group filter alone, because it only aligns time, not sub-frame phase. The trade-off: Unity’s approach forces you into frame-locked timing, which hurts responsiveness on variable-rate displays; Unreal’s sync groups can over-constrain your blend space, making transitions feel robotic. Neither is wrong—but you must test on the actual hardware at target frame rates, not in-editor at 200 fps.

Can I fix it with a shader?

You can mask it with a shader. You can't fix it. Most teams skip this: a post-process blur or a vertex animation offset can smear the visual lock long enough that the eye stops catching the stutter—but the underlying bone motion still snaps. That hurts. The moment you add any camera shake or dynamic lighting, the mask breaks and the phase lock reappears as a ghost limb or a foot that slides mid-air.

'A shader hides the symptom until the next lighting change. Then you ship with a bug you forgot you had.'

— lead animator on a shipped title that had to patch phase fixes twice post-launch

The real fix lives in the animation graph or the procedural solver. However, if you absolutely need a bandage for a deadline, use a vertex shader that applies a tiny sine-wave offset to the locked limb’s mesh—0.5–1.0 pixels of jitter breaks the phase lock perceptually without altering the blend. The cost: you introduce a high-frequency wiggle that will make QA call it 'shimmer.' Not recommended. Save the shader magic for effects that belong in the renderer, not the rig. Start with the blend logic; the GPU is not your animation debugger.

Final Recommendation: Start Simple

Normalize blend weights first

Start here. I have watched teams spend an entire afternoon tweaking solver stiffness values and interpolation curves—only to discover their blend weights summed to 1.07 instead of 1.00. That 7 % overage introduced a phantom acceleration that looked exactly like sub-frame phase locking. The fix? A single `normalize()` call. Weight normalization is the cheapest operation in Procedural Motion Systems and it solves roughly 60 % of unintended phase-locking cases I have encountered. Run-time cost is negligible, code changes are minimal, and you can verify the fix in a single playback pass. The odd part is—most people skip this because they assume their animation graph already enforces unit sums. It doesn't.

Check interpolation order second

If weights are clean but the problem persists, look at how your solver blends sub-frame samples. The common pitfall: blending positions before rotations, or applying angular velocity scaling after the blend instead of before. Wrong order introduces a sub-frame phase drift that feels like locking but is really a cumulative alignment error. We fixed this once by swapping two lines of a quaternion slerp call—took four minutes.

'We spent three days adjusting blend curves. The fix was swapping two Slerp arguments.'

— Lead Technical Animator, mid-budget title

That hurts. Interpolation order is free to change and reversible, so test it before touching any numeric parameters. Most engines let you re-order the blend pipeline without recompiling shaders or rebuilding animation graphs.

Only then adjust solver parameters

Reaching for damping ratios, spring constants, or blend speed multipliers is tempting—but expensive. Each solver parameter change requires re-tuning for every character, every animation state, often per clip. The cost compounds quickly. A weight-normalization fix propagates globally; a damping tweak doesn't. If you start by adjusting solver parameters, you may end up with twelve different per-clip overrides that fight each other across transitions. That makes the phase locking worse, not better. The recommendation is brutally simple: normalize weights (five minutes), verify interpolation order (ten minutes), and only then consider solver tuning. Roughly 80 % of cases die at step one. Why burn a day on the 20 % first?

Share this article:

Comments (0)

No comments yet. Be the first to comment!