Quick answer: Box2D’s solver works best for objects between 0.1m and 10m. With the default 50 pixels per meter, your objects should be 5–500px. Resize tiny props upward, or lower the Pixel Scale to match.

You’re building a tabletop-style puzzle with small physics objects — 12×12 pixel dominoes, marbles, dice. They jitter while “resting”, slowly drift, and stack unstably. A pile of dominoes can’t stay still even when nothing’s touching them. Scaling sprites up 4× in a test layout fixes the jitter completely.

Box2D’s Numerical Sweet Spot

Box2D was tuned for objects in the “real human” size range: 0.1 to 10 meters. The constraint solver uses iterative position correction with tolerances calibrated for that range. Below 0.1m, sub-millimeter errors become significant relative to object size, and the solver fails to converge — bodies oscillate or drift instead of settling.

Construct 3 abstracts the meter system via the Pixel Scale setting (default 50 px/m). A 12×12 px sprite is 0.24×0.24 meters — just inside the preferred range but at its lower bound. Bunch a few together with contact forces and the solver struggles.

Fix 1: Resize Sprites

Make the smallest physics-affected sprite at least 25 pixels in its smaller dimension. That’s 0.5m at default Pixel Scale — comfortably inside Box2D’s reliable range. Adjust your art and tilesets accordingly.

For a top-down marble game where marbles need to be small visually, scale up the whole world: make marbles 40px, walls proportionally larger, viewports zoomed in. Physics math operates on the same units as before, just at a more solver-friendly scale.

Fix 2: Lower Pixel Scale

Go to Project Properties → Physics → Pixel Scale. Default is 50. Try 25:

Physics behavior changes accordingly: same visual size, but the solver treats it as a larger object. Gravity feels weaker (more travel time per fall); tune Physics Gravity to compensate (e.g., raise from 10 to 20).

Fix 3: Increase Solver Iterations

If you can’t change object size, give the solver more iterations to converge:

In Project Properties → Physics, raise Velocity Iterations from 8 to 16, and Position Iterations from 3 to 6. Cost is double-ish CPU on physics step. Helps but doesn’t fully eliminate jitter for very small objects.

Fix 4: Lock Sleep Threshold

Once objects stop moving, Box2D puts them to “sleep”. Sleeping objects don’t simulate and don’t jitter. The threshold for sleep is tied to linear/angular velocity. If small objects never quite hit zero velocity (they always wobble at 0.5 m/s due to solver imprecision), they never sleep.

Force sleep on idle objects via event:

If Domino.Physics.LinearVelocity < 5 AND Domino.Physics.AngularVelocity < 5
    Domino.Physics.SetAwake False

The object is forced asleep when below your threshold. Manual but effective.

Verifying

Spawn 20 small objects in a pile and let them settle. Add a counter that increments each tick if any object’s position changed by more than 0.1 px. Before the fix, the counter keeps climbing forever. After the fix, the counter stops within 2–3 seconds of pile formation.

“Box2D wants meters. If your pixels-to-meters ratio puts objects below 0.1m, the solver loses precision. Resize up or scale down the world.”

For small-prop physics games, pick Pixel Scale early and design art to match. Retrofitting later means reshooting all sprite assets.