Ostatnio pracowałem nad szybką strzelanką 2D i natknąłem się na ogromny problem. Wykrywanie kolizji. Jasne, działa, ale działa bardzo wolno. Moim celem jest: mieć na ekranie wielu wrogów i nie dotykać się nawzajem. Wszyscy wrogowie ścigają gracza. Większość z nich ma tę samą prędkość, więc prędzej czy później wszyscy zajmują to samo miejsce, ścigając gracza. To naprawdę obniża współczynnik zabawy, ponieważ dla gracza wygląda to tak, jakbyś był ścigany tylko przez jednego wroga. Aby zapobiec zajmowaniu tej samej przestrzeni, dodałem wykrywanie kolizji (bardzo podstawowe wykrywanie 2D, jedyna znana mi metoda), które jest.
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
To działa dobrze. Tak długo, jak mam tylko <200 wrogich istot. Kiedy zbliżam się do 300-350 wrogich istot, moja częstotliwość klatek zaczyna spadać. Najpierw pomyślałem, że to źle renderuje, więc usunąłem ich call draw. To wcale nie pomogło, więc oczywiście zdałem sobie sprawę, że to metoda aktualizacji. Jedyną dużą częścią ich metody aktualizacji jest ta część, w której każdy wróg zapętla się przez każdego wroga. Kiedy zbliżam się do 300 wrogów, gra wykonuje krokową iterację 90000 (300 x 300). My my ~
Jestem pewien, że musi istnieć inny sposób podejścia do wykrywania kolizji. Chociaż nie mam pojęcia jak. Strony, które znajduję, dotyczą tego, jak faktycznie wykonać kolizję między dwoma obiektami lub jak sprawdzić kolizję między obiektem a płytką. Te dwie rzeczy już wiem.
tl; dr? Jak podejść do wykrywania kolizji między WIELKIMI podmiotami?
Szybka edycja: jeśli to pomoże, używam C # XNA.