Почему мое дерево квадрантов не улучшило производительность?

У меня есть установка моделирования стада boids. Первоначально это работало за счет того, что каждый боид зацикливался на каждом боиде, чтобы все они постоянно знали, где находятся друг друга, чтобы определить, близко они или далеко, но затем я переключился на дизайн quadtree, так что боиды должны проходить только через цикл. boids, которые на самом деле поблизости. Тем не менее, это практически не улучшило FPS симуляции. Как будто я все еще просматриваю каждый боид.

Есть ли какая-то ошибка в моей реализации? Репозиторий находится здесь, соответствующий код в основном находится в main.js, quadtree.js и boid. js. Живой сайт находится здесь


person Michael Moreno    schedule 01.05.2021    source источник
comment
Итак... если маленькие жучки двигаются, вам нужно пересоздавать дерево квадрантов для каждого кадра?   -  person enhzflep    schedule 02.05.2021
comment
Правильно, я воссоздаю дерево квадрантов каждый кадр.   -  person Michael Moreno    schedule 02.05.2021
comment
@Ouroborus Знаете ли вы какие-нибудь методы, которые хорошо работали бы с движущимися объектами, такими как боиды?   -  person Michael Moreno    schedule 02.05.2021
comment
@Ouroborus. Ради корректности, я думаю, вы хотели сказать, что использование квадрата расстояния, а не расстояния удаляет операцию SQRT, верно?   -  person enhzflep    schedule 02.05.2021
comment
@Ouroborus Вы упоминаете, что дерево квадрантов строится каждый кадр, что сводит на нет его полезность; Я не думаю, что это правда. Для одного кадра, если вы поместите все в дерево квадрантов, каждому боиду придется выполнять меньше проверок соседей для этого кадра благодаря пространственному разделению дерева квадрантов. Вопрос в том, перевешивает ли экономия на проверке соседей построение дерева квадрантов. Если вы профилируете его код, вы поймете, что ваша ставка неверна. Подавляющее большинство времени тратится на запросы дерева квадрантов, а построение дерева квадрантов сравнительно незначительно.   -  person ldlework    schedule 02.05.2021
comment
@Ouroborus Вы не правы, и я объяснил почему в ответе.   -  person ldlework    schedule 02.05.2021
comment
К вашему сведению, я написал ответ об использовании пространственных структур данных с boids или другими многоагентными симуляциями здесь: stackoverflow.com/a/68122142/ 1991373   -  person Craig Reynolds    schedule 26.06.2021


Ответы (1)


Причина, по которой вы не видите очевидного прироста производительности от Quadtree, заключается в характере вашего моделирования. В настоящее время разделение по умолчанию заставляет большое количество boids сходиться в одну и ту же позицию.

Множество объектов в одном и том же положении сведет на нет возможное ускорение из-за пространственного разделения. Если все объекты находятся в одинаковом или близком положении, боиды в области вынуждены проверять все другие боиды в этой области.

Вы можете продемонстрировать себе, что ваш Quadtree работает, просмотрев или профилировав свое приложение с его настройками по умолчанию. Теперь включите разделение до максимума. Вы увидите визуально или с помощью профилирования, что по мере того, как боиды распределяются более равномерно, FPS значительно увеличивается. Это связано с тем, что Quadtree теперь может предотвращать вычисления благодаря своему пространственному разделению.

С низким разделением по умолчанию: С низким разделением

С максимальным разделением: С максимальным разделением

Вы можете увидеть, как производительность увеличилась на втором изображении. Также обратите внимание, что предположение другого комментатора о том, что все время занимает построение Quadtree (insert), неверно.

Хотя в некоторых приложениях вы можете обновлять Quadtree по мере перемещения объектов, поскольку в этой симуляции каждая составляющая перемещается в каждом кадре, реконструкция Quadtree с нуля меньше работы, а затем удаление каждого объекта и повторная вставка его в новое положение.

Совет пропустить квадратный корень и просто использовать квадрат расстояния хорош, так как это даст вам немного больше производительности.

person ldlework    schedule 02.05.2021
comment
Отличный анализ. В основном нет никаких улучшений, потому что это BOIDS! - person slebetman; 02.05.2021