Обнаружение произвольных физических событий на некоторых телах. Насколько плохо продолжать опрашивать весь мир?

#events #game-physics #box2d

Вопрос:

Часто мне нужно обнаруживать произвольные «события» в Box2D.

Я пытаюсь выяснить, каков рекомендуемый способ выполнения обнаружения. Два основных способа, которые я могу придумать, — это либо опрос после каждого шага, либо использование взаимодействия с дополнительными физическими элементами.

Пример

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

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

Я могу придумать два способа определить, достаточно ли нажата кнопка:

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

Каков рекомендуемый подход? Есть ли другие способы?

  1. Первый метод кажется более простым, но он требует повторения каждой кнопки после каждого шага, что кажется расточительным: большинство кнопок будут спать на большинстве кадров.
  2. Второй способ кажется более оптимальным: никаких ненужных вычислений, если только что-то не происходит с кнопкой. Однако это предполагает добавление дополнительных тел в мир и увеличит нагрузку на двигатель.

Дальнейший вопрос, связанный с первым подходом

Является ли хорошей практикой повторять каждое тело после каждого шага? Делает ли Box2D это внутренне? Я предполагаю, что это не так.

Я всегда старался избегать этого, потому что это звучит как плохая идея-перебирать тонны тел 60 раз в секунду, большинство из которых будут инертными или спящими. Даже если я составлю список «интересных тел» и буду перебирать только их, их все равно будет много, и большинство из них большую часть времени будут спать. Из-за этого мне кажется, что это плохая практика.

Моя симуляция насчитывает десятки тысяч тел: большинство из них пассивны (например, стены), и только несколько тысяч «интересны». Большинство интересных из них большую часть времени спят и просыпаются только тогда, когда пользователь взаимодействует с ними. Несколько сотен могут все время бодрствовать, поскольку они активируются по своей собственной логике; Мне все еще нужно найти способ отключить их, когда они будут достаточно далеко от места происшествия. Я планирую расширить мир еще больше, чтобы я мог достичь в 10 или 100 раз этих цифр, если производительность не упадет слишком сильно.