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)