У фізичному двигуні, який я розробляю (для навчання), використовуючи love-2d , я реалізував рішення зіткнення таким чином:
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
...
Як ви бачите в кінці gif-анімації, відбувається FPS-розпад, коли всі колайдери майже заземлені над статичним об'єктом.
Це пояснюється тим, що кількість дозволів зіткнення зростає, коли об’єкти проводять більше часу, торкаючись, коли вони осідають. Однак багато з обчислень є "марними", оскільки об'єкти вже осіли у стійких положеннях один проти одного.
Яка найкраща практика (сподіваємось, що не вимагає ступеня фізики), щоб уникнути цих "марних" виявлень зіткнень?
Редагувати: прийняті підказки DMGregory та прийти до цього результату (ще не оптимально)
(Червоний = статичний, синій = активний, зелений = сплячий)