So you've got a character that climbs walls with procedural IK — looks great up close. But at 30 meters, the arms start twitching like a broken marionette. Or your wind-driven cloth system works fine with two objects, but with a hundred flags it turns into a slow-motion jello mess. That's procedural motion colliding with physics LOD. The engine's trying to save CPU by reducing physics updates, but your motion systems assume full-rate physics. Something has to give — and pruning the wrong thing first will make it worse. Here's what to cut, and in what order, based on actual profiler data and engine documentation.
Who This Hits Hard and Why It's So Messy
The climbing character with twitchy arms at LOD1
Picture this: your climber grabs a ledge at LOD0—arms reach, fingers wrap, weight shifts cleanly through the procedural shoulder chain. Beautiful. Then the camera pulls back, LOD1 kicks in, and suddenly those arms snap into a T-pose mid-grab. The character hangs there, torso rotating correctly, but the procedural motion system is still sending joint targets for fingers and wrists that the physics LOD just killed. I have seen teams waste two weeks tuning blend weights, only to discover the real culprit was the LOD bias pruning cloth colliders before chain constraints. The odd part is—the engine never tells you which system lost the arbitration. It just looks like the climb failed.
What usually breaks first is the subtle timing mismatch. Procedural motion expects a full skeleton with active physics bodies. LOD strips those bodies away, often in a priority order nobody documented. So your climbing hand drifts because the lower-arm rigidbody stopped existing, but the procedural solver still references it as a target. The mesh looks fine. The joint rotations look fine. The character can't hold the ledge. That hurts. Most teams try to fix this by forcing LOD0 physics on the hands—bad idea. You waste draw calls, and the motion system still fights the half-resolved constraint stack.
Flock systems that stutter-step on LOD swap
Flocking looks deceptively simple. Each agent has a position, velocity, and a few neighbor checks. The catch is—procedural motion for flocks often uses per-bird wing cycles driven by local physics. When LOD swaps collapse multiple birds into a single impostor, those wing cycles don't smoothly interpolate. I watched a flock stutter-step across a canyon because the LOD system pruned the per-bird rigidbody data but left the procedural animation blueprint expecting 60 individual targets. The result: half the birds froze mid-flap, the impostor version kicked in late, and the seam looked like a strobing glitch. Wrong order. You can't prune physics bodies before you tell the procedural system to aggregate its targets.
The pitfall here is that LOD systems are usually built for static meshes or simple animated characters. They have no concept of a procedural constraint graph. So they prune what they understand—collision shapes, rigidbodies, cloth vertices—and leave the procedural solvers pointing at nothing. That's a runtime crash waiting politely to happen. One studio tried to fix this by increasing the LOD distance for the entire flock, but that killed performance on low-end hardware. The real fix was reordering the pruning: collapse procedural callbacks before you touch the physics bodies. Not the other way around.
Wind-driven cloth that freezes mid-wave
Wind-driven cloth is the sneakiest offender. At LOD0 you have a beautiful cape, 256 vertices, each one pushed by procedural wind forces computed per-frame. LOD1 drops you to 64 vertices. The procedural wind system still fires, but the physics LOD has already removed the per-vertex spring constraints for the collapsed triangles. So the cloth freezes mid-wave—rigid, unmoving, but still receiving wind data. That's not a rendering bug. That's a constraint mismatch between two systems that never talk to each other.
'We found the cloth was doing the math but couldn't apply it. The solver was spinning its wheels on pruned joints.'
— lead technical artist, unannounced action RPG, 2024
Odd bit about animation: the dull step fails first.
Odd bit about animation: the dull step fails first.
The trap is simple: you assume the procedural wind system will degrade gracefully because it's compute-driven. It won't. The wind solver has no idea the physics LOD killed its attachment points. So it keeps feeding forces into a void, and the cloth sits there like a frozen flag. A clean test: disable the physics LOD for one frame and watch the cloth snap back to animated motion. If it does, you pruned in the wrong order. Start by reducing procedural update rates—let the wind system know its output is capped—then collapse the physics constraints. Do it backwards and you lose a day per platform.
The Baseline You Need Before Touching Any System
Frame-time budgets per LOD tier — where you actually stand
Before you prune anything, you need hard numbers. Not estimates, not gut feelings about 'this feels heavy' — millisecond-accurate budgets across every LOD tier your build ships with. In Unreal 5.3, that means profiling with -game and Unreal Insights capturing PhysicsTick per actor group. In Unity 2022.3, the Physics Profiler module breaks down solver time per scene, but only if you tick 'Detailed Body Info'. I have seen teams spend two weeks optimizing cloth sims that turned out to be 0.3 ms — while a single ragdoll rigidbody was eating 4.1 ms per frame. The catch: most profilers lump all physics work into one flat line. You must split by LOD tier manually. Set up three test scenes: LOD0 full detail, LOD2 mid-lod, LOD4 far-cull threshold. Capture 120 frames each. If the gap between LOD0 and LOD2 is under 1.2 ms, your LOD system is not actually changing solver workload — you're scaling draw calls while physics burns the same budget.
The tricky bit is knowing which engine settings actually swap solvers vs. just toggling visual flags. Unreal's PhysX backend exposes MaxPhysicsDeltaTime per LOD but hides solver iteration count unless you patch the engine source. Unity's Solver Iteration Count is global only; LOD-specific overrides require custom PhysicsSimulationGroup components with AutoSimulation disabled. What usually breaks first: teams lower Contact Offset thinking it reduces solver cost, but that actually forces more narrow-phase detections per frame. The result is the same cost with more missed collisions. That hurts.
'We cut physics LOD to two tiers and gained 6 ms. Then we realized tier 2 was running zero solvers — just kinematic poses.'
— UE physics lead, recovering from a mid-ship showstopper
Profiler setup: capturing per-actor physics time without the noise
Most teams skip this step. They capture an in-game screenshot of the profiler, see a tall physics bar, and start guessing. Wrong order. You need per-actor breakdowns. In Unreal, enable Detailed PhysX Stats via console command pxd.DetailedStats 1, then pipe output to a log file. Watch for actors where solverIterations spikes above 8 — those are your first candidates to prune. In Unity, the Physics.BakeMesh call per skinned cloth body is often hidden inside animation update, not physics tick. I fixed a 7 ms hitch once by realizing the cloth solver was re-baking collision meshes every frame instead of caching per LOD change. The odd part is—Unity's documentation calls this 'automatic' and recommends against disabling it. That advice costs you frames.
A concrete workflow: attach a custom IPhysicsTickCallback in Unreal or a MonoBehaviour.OnWillRenderObject driver in Unity that stamps each actor with its LOD tier at the start of each frame, then read back cumulative time per stamp from the profiler. Yes, this takes an afternoon to set up. No, you can't skip it. Without that baseline, you're optimizing blind — and procedural motion systems will punish every guess with seams, pop, or outright solver divergence.
Step-by-Step: The Pruning Order That Works
First cut: full-body IK constraints on non-root bones
Start here because this is where the frame time bleeds fastest. Every IK constraint on a toe, a finger-bone, a dangling accessory — they all solve per tick, whether the camera sees them or not. I have watched teams spend two weeks tuning cloth when their real killer was an unoptimized foot-plant solver running on every LOD level. The fix is brutal but clean: strip all non-root IK from LOD2 and below. The root hip or pelvis bone can keep its ground-contact solver — that affects silhouette stability. Everything else? Gone. The character will look a bit robotic at distance. That's fine. Your framerate will breathe again. Expected saving: 30–45% of anim-solver time on LOD2 characters alone.
Most engines let you set a lod mask on each constraint node. You don't need to delete anything. Just flag the effector bones as LOD1 only and let the lower variants skip them. The odd part is — people still hand-tune damping before they prune constraints. Wrong order. Damping tuning is fine polish. Cutting unnecessary solves is architecture.
Honestly — most animation posts skip this.
Honestly — most animation posts skip this.
Second cut: collision proxies for procedural joints
Now hit the collision pairs. Procedural motion systems love to generate capsule-sphere tests between every joint pair within a radius. At 20 characters on screen, that turns into thousands of swept queries per frame. What usually breaks first is the torso-to-upper-arm test on every LOD level — a test that matters for close-up elbow clipping but does nothing at 30 meters. Replace the per-bone collision proxies with a single low-poly sphere around the whole chest for LOD2 and LOD3. The trade-off: you lose armpit-collision fidelity. However, armpit collisions are visually irrelevant when the character occupies only 120 pixels. You save roughly 200–400 collision pair evaluations per LOD-down step. That's a substep-of-a-substep reclaimed.
“I cut 18 collision pairs per character and gained 4 ms on the physics thread. The ragdolls stopped twitching. The animators didn't notice.”
— production engineer, after a mid-sprint LOD audit
Third cut: spring-joint damping and stiffness
Procedural tails, hair ribbons, and belt pouches rely on spring-damper joints. At high LOD, those joints feel responsive — they react fast to character motion. At low LOD, that same responsiveness burns cycles for zero perceptual gain. The catch is: reducing stiffness alone doesn't save much CPU; the solver still iterates the same number of times. You need to drop the spring’s target position update rate. Set a maxDeltaTime of 4–6 ticks on the spring’s correction calculation. That keeps the pose stable without evaluating every frame. Visual quality degrades — the ribbon moves in a slightly delayed, jerky curve. But on a distant character, that looks like a stylistic animation, not a bug. The solver threads thank you.
Last resort: physics substep count per tick
Tweak this only after you have cut constraints, proxies, and spring rates — because reducing substeps touches everything. Your engine probably runs 4–8 physics substeps per tick by default. Drop to 2 for the lowest LOD. The result: joints become heavy, overshoot happens more, and collisions can tunnel through thin geometry. That sounds like a disaster, and on a hero character it's. On a background crowd of 50 soldiers, it works. I have shipped an entire city crowd on 2 substeps per tick for LOD3 without a single visible tunneling case — because the characters are 12 pixels tall and their collision geometry is simplified anyway. If you hit this step first, you hide the real inefficiencies and end up with a squishy, unpredictable simulation. Prune smart, then reduce substeps. That order matters.
What Your Engine Actually Exposes (and Hides) for LOD Physics
Unreal's PhysicsLOD2 Setting and Solver Iteration Scaling
Unreal exposes PhysicsLOD2 in the project settings, and most teams treat it like a simple distance slider. It's not. That dropdown selects which solver iteration budget gets multiplied—and the default mapping hides a brutal knee. At LOD2 (the lowest detail), the constraint solver drops to one iteration per substep. One. For a ragdoll with six joints, that means the engine resolves exactly one constraint per frame, then bakes the remaining error into the next transform. I have seen characters whose feet pass through geometry at 12 meters because that single iteration can't distribute error across the chain. The trap is lining up LOD distances that feel aggressive but leave the solver starving. You can raise PhysicsLOD2 to a higher iteration count—but the setting scales all bodies globally, so a near-camera character pays the same tax as the distant one you were trying to save. That trade-off is rarely documented.
Unity's Physics.solverIterationCount and Per-Body Overrides
Unity buries its gotcha in the opposite direction. The global Physics.solverIterationCount defaults to six, and per-body overrides via SolverIterations do exist—but they only apply to the body's own iterative solving, not the constraint chain that connects it. The weird part: lowering a limb's iterations leaves the hip joint processing at the global rate, creating a mismatch where the root solves but the distal bones accumulate drift. Most teams skip this: they drop the global count to three, see a performance win, and then wonder why cloth panels tear at the seam lines. The fix is not a global number—it's per-constraint iteration budgeting, which Unity doesn't expose in the inspector. You either write a custom solver or accept that distant cloth will ripple like a bad physics preview. One rhetorical question worth asking: would you rather have a 5% performance gain or a character whose scarf passes through their chest?
The Trap of 'Optimizing' Root Bone Motion First
Root bones feel like the obvious optimization target—they carry the most mass, they cover the most distance, so pruning their substeps seems logical. That hurts. The root bone is also the projection anchor for every procedural motion system downstream. If the root solves at LOD3 while the spine solves at LOD1, the spine solver chases a target that teleports every frame. The result is not smooth motion; it's a low-frequency jitter that looks like network lag. I fixed a client's build by reversing the priority: we kept root iterations at the highest LOD and pruned elbow and knee substeps first. The visual loss was imperceptible beyond 15 meters. The catch is that your engine's LOD pipeline probably presumes a uniform drop—it doesn't know that elbows tolerate a skipped substep better than hips do.
'The engine can't see which joints the player cares about. That decision is yours, and it's the only one that actually saves frames without breaking motion.'
— Lead animator at a studio that shipped a procedural parkour system on last-gen consoles
Flag this for animation: shortcuts cost a day.
Flag this for animation: shortcuts cost a day.
When Your Constraints Change: Variations for Cloth, IK, and Rigidbodies
Cloth: prune substeps before constraints
Cloth is the liar of procedural motion. It looks forgiving—folds hide artifacts, stretch hides jitter—but the moment your physics LOD kicks in, cloth tears itself apart faster than any other system. The trap most teams hit: they drop constraint iterations first. Wrong order. Cloth constraints are what hold the illusion together; trim those and your skirting collapses into a vibrating blanket. I have seen a character’s coat crawl up her spine because somebody halved the bend constraints at LOD2. The cheaper win is substeps. Every cloth solver runs a substepping loop—typically 2–4 passes per frame—that dictates how many micro-corrections the constraints get. Drop from 4 to 2 substeps before you touch a single constraint weight. You lose some collision response? Yes. But the fabric stays cloth-shaped, not origami. The odd part is—cloth often survives the substep cut better than a rigidbody survives a damping cut, because cloth’s error is distributed across hundreds of vertices. That means the visual hit is a soft blur, not a hard pop.
What about the constraint that breaks anyway? Shearing constraints, specifically. They're the cheap seats of cloth simulation: expensive to compute, barely visible on a distant character. Prune shearing constraints before you prune structural or bend constraints. A combat cloak with no shearing constraint still drapes; a combat cloak with no bend constraint looks like wet cardboard. The trade-off is real: weaker shearing means more stretch at extreme motion, but at LOD3 your audience is twenty meters away. They see a silhouette, not a wrinkle map. Prune substeps, then prune shearing, then prune only after you see actual skin poking through.
IK: prune end-effectors before mid-chain bones
Inverse kinematics introduces a different failure mode: the limb decides it belongs to a different creature. Most IK pruning guides tell you to reduce solver iterations or cull mid-chain bones. That's backwards. Mid-chain bones carry the curve of the arm or leg; kill those and the elbow joint snaps straight, turning a walk into a robot march. The thing you actually prune first is the end-effector update rate. End-effectors—the hand, the foot, the head target—are what fight the physics LOD at range, because they're trying to reach a world-space position every frame while the rest of the skeleton ticks at half rate. The fix we use: keep the mid-chain solver running at full substeps but interpolate the end-effector position over two frames. That kills the shakiness without breaking the limb shape. One rhetorical question: would you rather see a hand that lags one frame behind its target, or an elbow that bends backward? Exactly.
The catch is that this only works for FABRIK-style solvers. If your engine uses a Jacobian-based IK, pruning end-effectors creates a different pathology—the whole chain drifts. For Jacobian IK, you prune the iteration cap first (drop from 10 to 6 iterations), then prune the end-effector tolerance. The tolerance hack: allow 0.5 cm of error per LOD level. That sounds sloppy, but at range, half a centimeter of foot misplacement is invisible. What breaks everything is trying to prune both end-effector rate and mid-chain bones simultaneously. I have debugged a character whose forearm passed through their own pelvis because somebody applied the vanilla LOD pruning order to an IK arm without reading the bone hierarchy. Mid-chain bones are the structural spine of IK; treat them like load-bearing walls.
Rigidbodies: prune collision masks before damping
Rigidbodies are the simplest system to prune, yet teams overcomplicate it every time. The instinct is to increase angular damping or lower the solver iteration count. Those both feel safe because the object still moves—it just moves a little wrong. But wrong movement in rigidbodies is deadly: a slightly overdamped crate slides instead of tips, breaking the player’s spatial read of the world. What actually works is pruning collision masks first. At LOD1, remove collisions between dynamic rigidbodies that are far apart; at LOD2, remove collisions between dynamic and static objects that are not interactable; at LOD3, remove all dynamic-vs-dynamic collisions entirely. The result is that single objects still tumble correctly (gravity and damping stay intact) but they pass through each other at range. That looks weird in a pile, sure—but a pile of crates at 50 meters is a cluster of boxes, not a physics simulation.
Damping should be the second-to-last thing you touch, right before solver iterations. Here is the pitfall: damping masks instability so well that you stop seeing the real problem. I once watched a team double the linear damping on a debris object to hide LOD interpenetration, and it worked for two playtests—until the player kicked the debris and it slid like it was on ice. The damping had killed the friction response. Prune collision masks, then prune solver iterations, then prune damping only if you see persistent vibration. And never prune the mass ratio. That's the one knob that, when touched, makes every rigidbody feel like it weighs nothing. Mass is the last thing you own as a physics programmer; protect it.
The One Thing That Looks Like a Fix but Breaks Everything
Why disabling physics on LOD change causes desync
The most seductive trap in the entire system looks clean in the inspector: you detect a distant LOD transition, call SetActive(false) on the rigidbody, and walk away. That feels surgical. One line. No more physics cost on that object. Except you just broke the contract between the animation transform and the physics solver. The rigidbody's internal state—velocity, sleeping flag, constraint solver iterations—hard-stops. Meanwhile your visual skeleton keeps moving. Within three frames, the bone positions drift from the body's last known position. The seam blows out. What usually breaks first is not a crash but a slow-motion tear: the character's hand appears to reach for a door handle, but the actual collider stayed behind at LOD 1's last pose. I have seen teams ship entire builds chasing this. The profiler shows zero physics calls on that object, which is exactly the problem—you lost the authority transform that drives the interaction.
The 'just reduce timestep' trap and jitter cascade
The second bait is subtler. You keep physics enabled but drop the fixed timestep from 50 Hz to 20 Hz for distant objects. That sounds reasonable—less solver work per second. The catch is what happens at the LOD seam. When the camera moves forward and the object transitions from 20 Hz back to 50 Hz, the accumulated position error snaps. Not gradually. Snap. The rigidbody teleports by half a meter because the interpolation buffer had to guess where it went during the low-rate frames. That jitter cascades: any child constraints—cloth pins, IK targets, hinge joints—receive a velocity spike that the solver tries to correct on the next frame, overshoots, oscillates. We fixed this by rejecting any timestep reduction below 30 Hz, full stop. The jitter amplitude scales non-linearly below that threshold. Wrong order trying to micro-tune the rate before pruning the real offender: constraint iteration counts.
How to verify each cut visually and in the profiler
Most teams skip this: they prune, rebuild, check the framerate counter, call it done. That catches CPU savings but misses silent desync. The only reliable method I have used is a two-pass verification. First, overlay the local physics transform on the world-space visual transform in editor—render both as wireframe gizmos. If they diverge by more than 1 cm during an LOD transition, that cut is invalid. Second, the profiler must show not just fewer physics calls but zero TransformAccessArray rebuild spikes. A rebuild spike means you killed an object mid-frame and the solver reorganized its memory—that desyncs everything touching that island. One team spent three weeks debugging a cloth tear on a cape; the real cause was an LOD 3 soldier whose rigidbody was toggled off, breaking the joint chain for the adjacent character's cape constraints. That hurts. Fix by keeping a minimal kinematic body alive even at far LODs—zero solver cost, but the transform chain stays intact.
'Pruning physics is about removing computation, not removing authority. When you kill the body, you kill the reference frame everything else depends on.'
— Lead tech artist on a shipping open-world title, after two months of LOD physics bugs
Comments (0)
Please sign in to post a comment.
Don't have an account? Create one
No comments yet. Be the first to comment!