Broadphase в физическом движке Cannon.js отвечает за первичное определение потенциальных столкновений между объектами. Его задача — снизить количество пар тел, которые будут проверяться на точное столкновение на этапе narrowphase, и тем самым оптимизировать производительность симуляции. В Cannon.js предусмотрено несколько алгоритмов broadphase, каждый из которых подходит для разных типов сцен.
NaiveBroadphase — самый простой алгоритм. Он проверяет
все возможные пары тел в сцене.
Особенности:
O(n²)).Когда использовать:
Пример использования:
const world = new CANNON.World();
world.broadphase = new CANNON.NaiveBroadphase();
world.gravity.set(0, -9.82, 0);
SAPBroadphase — более эффективный алгоритм, использующий
сортировку тел по координате для быстрого исключения пар, которые не
могут столкнуться.
Принцип работы:
Преимущества:
Недостатки:
Пример использования:
const world = new CANNON.World();
world.broadphase = new CANNON.SAPBroadphase(world);
world.gravity.set(0, -9.82, 0);
Дополнительные параметры:
world.broadphase.axisIndex — ось для сортировки (0 — X,
1 — Y, 2 — Z).| Алгоритм | Сложность | Лучшая сцена | Ограничения |
|---|---|---|---|
| NaiveBroadphase | O(n²) | Мало объектов | Быстро теряет производительность |
| SAPBroadphase | O(n log n) | Плотно расположенные объекты | Худший случай при случайном распределении объектов |
Совет по оптимизации:
const world = new CANNON.World();
world.gravity.set(0, -9.82, 0);
// Выбор алгоритма в зависимости от сцены
world.broadphase = new CANNON.SAPBroadphase(world);
world.broadphase.axisIndex = 0; // сортировка по X
const sphereBody = new CANNON.Body({
mass: 5,
shape: new CANNON.Sphere(1)
});
sphereBody.position.set(0, 10, 0);
world.addBody(sphereBody);
const timeStep = 1 / 60;
world.step(timeStep);
С SAPBroadphase при большом количестве объектов количество проверок на столкновение сокращается многократно, что позволяет симулировать тысячи объектов без заметного падения производительности.
Выбор алгоритма broadphase напрямую влияет на производительность симуляции в Cannon.js. NaiveBroadphase прост и универсален, но плохо масштабируется. SAPBroadphase эффективен для сцен с упорядоченными объектами и большим количеством тел. Оптимизация broadphase является ключевым моментом для сложных симуляций и игр с высокой динамикой объектов.