← На главную

Box3D ускорил симуляцию выпуклых hull вдвое благодаря SSE2

22.07.2026 21:09 · hackernews

Разработчик Box3D реализовал «wide SIMD» для ускорения детектирования столкновений выпуклых оболочек. Идея — обрабатывать несколько рабочих единиц одновременно. В контактном солвере это означает решение четырёх точек контакта за раз, но теперь тот же подход применили к фазе узкого поиска коллизий. В отличие от «narrow SIMD», где в регистр укладывают трёхмерный вектор и считают векторную математику, wide-подход даёт более заметный выигрыш, особенно в 3D.

Движок использует Separating Axis Test (SAT) — он не требует отступа между фигурами, поэтому объекты могут лежать прямо друг на друге, в отличие от связки GJK/EPA с их «зазорами» и падениями в fallback. Но у 3D-SAT квадратичная сложность на тестах ребро-ребро. Для простой коробки (8 вершин, 6 граней, 12 рёбер) при пересечении двух таких hull получается 144 edge-комбинации. А для «булыжника» — оболочки на 32 точки из бенчмарка convex pile, портированного из PEEL, — уже 59 граней и 89 рёбер. Два булыжника дают 7921 проверку ребра против ребра, и именно эти вычисления легко захватывают всё время симуляции.

Раньше код выглядел как двойной цикл по всем рёбрам каждого hull. Теперь Box3D переводит данные в формат structure of arrays и за одну итерацию тестирует одно ребро из hull A против сразу четырёх рёбер hull B. Реализованы только SSE2-интринсики. Бенчмарк на 500 шагов падения 5120 оболочек запускали на AMD 7950x с фиксированной частотой 4.42 GHz, лучший результат из четырёх прогонов для разного числа потоков:

SSE2-версия оказалась более чем вдвое быстрее скаляра на всей симуляции, а бесплатный бонус от AVX2 добавил ещё несколько процентов. В будущем, возможно, появится честная AVX2-реализация с обработкой восьми рёбер одновременно. При этом на столкновениях коробка-коробка wide-оптимизация почти не даёт эффекта — она заметна только на сложных hull, какие возникают, например, при разрушениях.

В Box2D есть полноценные AVX2-интринсики, но немало пользователей сидят без AVX2-совместимых CPU, поэтому в Box3D ограничились SSE2. Также в движке жёстко задан лимит в 128 рёбер — это держит хранилище оболочки компактным. Конвертация чрезмерно детализированных hull в меши могла бы решить проблему квадратичного роста, но делает фигуры менее пригодными для динамических тел. Автор прилагает видео со сравнением и графиком покадрового времени выполнения.

Читать оригинал →