Нет. Обнаружение столкновения не всегда O (N ^ 2).
Например, скажем, у нас есть пространство 100x100 с объектами размером 10x10. Мы могли бы разделить это пространство на ячейки размером 10х10 с помощью сетки.
Каждый объект может содержать до 4 ячеек сетки (он может помещаться прямо в блоке или быть «между» ячейками). Мы могли бы хранить список объектов в каждой ячейке.
Нам нужно только проверить наличие столкновений в этих ячейках. Если в ячейке сетки имеется максимальное количество объектов (скажем, в одном блоке никогда не бывает более 4 объектов), то обнаружение столкновений для каждого объекта равно O (1), а обнаружение столкновений для всех объектов - O (N).
Это не единственный способ избежать сложности O (N ^ 2). Существуют и другие методы, более подходящие для других случаев использования - часто с использованием древовидных структур данных.
Алгоритм, который я описал, является одним из типов разделения пространства , но существуют и другие алгоритмы разделения пространства. Посмотрите Типы структур данных разделения пространства для большего количества алгоритмов, которые избегают временной сложности O (N ^ 2).
Механизмы поддержки Box2D и Bullet позволяют сократить количество проверяемых пар.
Из руководства , раздел 4.15:
Обработка столкновений на физическом этапе может быть разделена на узкофазную и широкофазную. В узкой фазе мы вычисляем точки контакта между парами фигур. Представьте, что у нас есть N фигур. Используя грубую силу, нам нужно выполнить узкую фазу для N * N / 2 пар.
Класс b2BroadPhase уменьшает эту нагрузку, используя динамическое дерево для управления парами. Это значительно уменьшает количество узкофазных вызовов.
Обычно вы не взаимодействуете с широкой фазой напрямую. Вместо этого Box2D создает и управляет внутренней фазой. Кроме того, b2BroadPhase разработан с учетом цикла симуляции Box2D, поэтому он, вероятно, не подходит для других случаев использования.
Из Bullet Wiki :
Существуют различные виды широкофазных алгоритмов, которые улучшают наивный алгоритм O (n ^ 2), который просто возвращает полный список пар. Эти оптимизированные широкие фазы иногда вводят еще больше не сталкивающихся пар, но это компенсируется их в целом улучшенным временем выполнения. У них разные рабочие характеристики, и ни одна из них не превосходит другие во всех ситуациях.
Динамическое дерево AABB
Это реализуется btDbvtBroadphase в Bullet.
Как следует из названия, это динамическое дерево AABB . Одна полезная особенность этой широкой фазы состоит в том, что структура динамически адаптируется к измерениям мира и его содержанию. Он очень хорошо оптимизирован и очень хорош для общего назначения. Он обрабатывает динамические миры, в которых много объектов находятся в движении, а добавление и удаление объектов происходит быстрее, чем в SAP.
Развертка и обрезка (SAP)
В Bullet это диапазон классов AxisSweep. Это также хорошая широкая фаза общего назначения, с ограничением, что она требует фиксированного размера мира, известного заранее. Эта широкая фаза имеет наилучшие характеристики для типичных динамических миров, где большинство объектов практически не имеют движения. И btAxisSweep3, и bt32AxisSweep3 квантуют начальную и конечную точки для каждой оси в виде целых чисел, а не чисел с плавающей запятой, чтобы повысить производительность.
Следующая ссылка является общим введением в широкофазу, а также описанием алгоритма Sweep and Prune (хотя он называет его «Sort and Sweep»):
http://www.ziggyware.com/readarticle.php?article_id=128
Кроме того, взгляните на страницу википедии:
http://en.wikipedia.org/wiki/Sweep_and_prune