Box2d raycast против производительности запросов AABB

В настоящее время я пытаюсь улучшить производительность игры, в которой используется физика box2d (фактически box2dlights).

У меня есть метод, который делает несколько (скажем, от 16 до 64) радиопередач в известной области. Интересно, было бы хорошей идеей сделать AABB-запрос в этой области на первом этапе, чтобы проверить, есть ли что-то, что могли бы сообщить raycasts. Если нет, я могу пропустить радиопередачи. Но если запрос AABB находит что-то, я должен сделать raycasts, и запрос был излишним. Насколько быстрый запрос AABB по сравнению с raycast (особенно в box2d)? Является ли хорошей идеей сделать часто лишний запрос AABB, если я могу пропустить некоторые лучевые трансляции по очереди?

0 ответов

Вы действительно должны определить, по крайней мере, скрытым способом, действительно ли вам нужно добавить фазу тестирования AABB.

Похоже, вы на самом деле используете raycast для освещения. Разумеется, если это так, в большинстве случаев ваши лучи-касты действительно будут пересекаться. У вас, вероятно, будет внешняя граница вашего окружения. Это означает, что, скорее всего, тест AABB, который вы реализуете в такой среде, будет пересекаться большую часть времени, если не все время.

Кроме того, исходя из предположения о том, что лучи-трансляции выполняются радиально для целей 2D-освещения, AABB лучей, начинающихся из центрального местоположения, несколько вырожден в том смысле, что каждый луч (луч бесконечной длины) будет приведет к одному из 4 возможных AABB:

x=0, y=0, x -> infinity  y -> infinity
x=0, y=0, x -> infinity  y -> -infinity
x=0, y=0, x -> -infinity y -> infinity
x=0, y=0, x -> -infinity y -> -infinity

Было бы скорее пустой тратой времени, если бы вы выполняли raycast, например, 64 радиально эквидистантных луча и наивно выполняли 64 проверки AABB (по одной для каждого raycast), поскольку, например, все 16 лучей с положительным x и положительным направлением y будут преобразовываться в один и тот же AABB чек (первый из перечисленных выше).

Вы можете сделать что-то вроде всегда выполнять эти 4 проверки AABB, и если одна из них ничего не пересекает, вы можете пропустить 16 рейкастов. Но это произойдет только в том случае, если вы дойдете до края окружающей среды.

AABB не очень подходит для ускорения рассылки лучей, потому что только те лучи, которые близки к выравниванию с осью, будут хорошо смоделированы с помощью AABB (ограничивающая рамка с выравниванием по оси).


Также существует альтернативный мыслительный процесс, который может показать вам, что тест AABB вряд ли поможет.

Цель использования Box2D для выполнения рейкастов заключается в том, что эта библиотека предоставляет сложные механизмы для ускорения рейкастов. См. Из World Querying iforce2d:

Box2D предоставляет два инструмента для [запросов мира] - кастинг лучей и тестирование AABB. Кастинг Рэя... разве мы это не сделали? Да, мы сделали это вручную, перебрав все приборы в мире и сравнив луч со всеми, чтобы определить, какой из них ближе всего. Это может быть очень неэффективным, если у вас в сцене большое количество приборов. Лучше всего использовать функцию RayCast самого мира. Это позволяет движку фокусироваться на приборах, которые, как ему известно, находятся рядом с траекторией луча.

Эта библиотека будет использовать свое встроенное пространственное представление мира со встроенными структурами ускорения, чтобы выяснить, с какими телами будет пересекаться конкретный луч. На самом деле это смысл существования box2dlights.

Из-за этого нет цели использовать AABB (другой тип мирового запроса, который предлагает Box2D), чтобы попытаться его дополнить. Если бы это действительно было разумным поступком, то Box2D уже сделал бы это за вас под капотом в функции raycast.

Другие вопросы по тегам