Я сделал нечто подобное много лет назад и описал движение шаров в зависимости от времени. Используя этот метод, я смог найти точное время пересечения для любых двух шаров. Каждый мяч сохранял приоритетную очередь с наименьшим временем пересечения в начале очереди, и очереди были бы скорректированы, когда произошло столкновение. Это работало очень хорошо и было довольно легко для первого прохода, который не имел ускорения к шарам. Позже (с более сложной математикой) я также смог расширить его для работы с добавленным трением.
Основным недостатком этого метода является то, что вычисления, как правило, выполняются одновременно, а затем на некоторое время, вместо того, чтобы выполнять небольшую работу в каждом кадре. Это означает, что ваша частота кадров не будет стабильной. Это не вызвало каких-либо заметных сбоев на оборудовании, на котором я работал лет 8 назад. Даже в перерыве или в странных, более или менее невозможных случаях, когда несколько шариков точно соприкасаются и движутся в одном направлении, когда они ударяются о стену, это может привести к падению частоты кадров, но ничего заметного не произойдет.