Quick answer: Raise the sleep threshold sensibly, remove constant tiny forces that keep bodies awake, and let resting bodies sleep so the solver skips them entirely.
A scene where all the debris has come to rest but the physics step still eats CPU has rigidbodies that refuse to sleep. Sleeping bodies are skipped by the solver, so getting them to sleep is a big win. Here is how to fix it.
How to fix it
1. Raise the sleep threshold
Increase the project sleep threshold (and per-body if available) so bodies that are essentially still cross into sleep instead of being kept awake by tiny residual velocities.
2. Stop poking idle bodies
Audit code and constant forces (wind, buoyancy, conveyor pushes) that touch resting objects every frame; even a tiny force resets the sleep timer and keeps the solver busy.
3. Deactivate truly static debris
Once debris has settled, convert it to static or disable its rigidbody so it leaves the simulation island entirely, freeing the solver from ever considering it again.
Catching the ones you can't reproduce
The hardest version of this to fix is the one you can't reproduce — it only happens on a player's hardware, OS, driver, or save state, under conditions that simply aren't present on your machine. A report that says “it crashed” or “it froze” gives you nothing to act on, so the bug survives release after release while quietly costing you players.
Automatic error capture closes that gap. Each failure arrives with its full stack trace, the device and OS, the build number, and a breadcrumb trail of what the player did right before it broke, so even a failure you have never seen becomes a specific, reproducible issue. Fold identical failures into one signature ranked by how many players each hits, and your worklist sorts itself worst-first instead of arriving as a stream of vague complaints.
This is where a tool like Bugnet earns its place. Its SDK captures every error automatically with the full stack trace plus device, OS, memory, build, and game-state context, folds duplicates into one grouped issue with an occurrence count, and ties each to the build it first appeared on — so you fix the problem that hurts the most players first and confirm it is gone when its signature disappears from the next release.
Ship the fix, watch the signature disappear from the next build. That's how you know it's really gone.