In a physics engine I'm developing (for learning) using love-2d, I implemented collision resolutions in this way:
FixedUpdate(dt) // I use fixed timestep foreach collide c1 in allNotStaticColliders c1.integartePhysic // i.e. apply gravitational force.. foreach collider c2 "near" c1 // "near"= I use spatial hashing if collide(c1,c2) resolve collision (c1,c2) // the heavy operation collison callbacks c1 collison callbacks c2 ...
As you can see at the end of the gif animation, there's a FPS decay when all colliders are almost grounded over a static object.
This because the number of collision resolutions grows as objects spend more time touching as they settle. However, many of the calculations are "useless" because objects have already settled into stable positions against each other.
What's the best practice (hopefully not requiring a physics degree) to avoid these "useless" collision detections?
Edit : accepted DMGregory hints and come to this result (not yet optimal)
(Red=static, Blue=active, Green=sleeping)