Нещодавно я працював над швидкодіючим 2d-шутером і зіткнувся з могутньою проблемою. Виявлення зіткнення. Звичайно, це працює, але це дуже повільно. Моя мета: мати багато ворогів на екрані і мати їх, щоб вони не торкалися один одного. Усі вороги переслідують сутність гравця. Більшість з них мають однакову швидкість, тому рано чи пізно всі вони в кінцевому підсумку займають однаковий простір, переслідуючи гравця. Це дійсно скасовує забавний фактор, оскільки для гравця схоже, що за вами переслідує тільки один ворог. Щоб не зайняти той самий простір, я додав виявлення зіткнення (дуже основне 2D-детектування, єдиний мені відомий метод).
Enemy class update method
Loop through all enemies (continue; if the loop points at this object)
If enemy object intersects with this object
Push enemy object away from this enemy object
Це чудово працює. Поки у мене є лише 200 ворожих утворень, тобто. Коли я наближаюся до 300-350 супротивників, частота кадрів починає сильно знижуватися. Спершу я подумав, що це погана передача, тому я зняв їхній розіграш. Це зовсім не допомогло, тому я зрозумів, що це метод оновлення. Єдиною важкою частиною їхнього методу оновлення є ця частина «ворог-петлі-через-кожного-ворога». Коли я наближаюся до 300 ворогів, гра робить ітерацію кроком 90000 (300x300). Мій мій ~
Я впевнений, що повинен бути інший спосіб, щоб допомогти цьому виявити зіткнення. Хоча я поняття не маю як. Сторінки, які я знаходжу, розповідають про те, як насправді зробити зіткнення між двома об’єктами або як перевірити зіткнення між об'єктом і плиткою. Я вже знаю ці дві речі.
tl; dr? Як я можу визначити виявлення зіткнень між LOTS сутностей?
Швидке редагування: якщо це допоможе, я використовую C # XNA.