Недавно я работал над быстро развивающимся 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). Мой мой ~
Я уверен, что должен быть другой способ приблизиться к этому обнаружению столкновения. Хотя понятия не имею как. Страницы, которые я нахожу, о том, как на самом деле сделать столкновение между двумя объектами или как проверить столкновение между объектом и плиткой. Я уже знаю эти две вещи.
Т.Л., др? Как мне достичь обнаружения столкновений между множеством объектов?
Быстрое редактирование: если вам нужна помощь, я использую C # XNA.