Vor kurzem habe ich an einem rasanten 2D-Shooter gearbeitet und bin auf ein gewaltiges Problem gestoßen. Kollisionserkennung. Sicher, es funktioniert, aber es ist sehr langsam. Mein Ziel ist: Habe viele Feinde auf dem Bildschirm und lasse sie sich nicht gegenseitig berühren. Alle Feinde jagen die Spielereinheit. Die meisten von ihnen haben die gleiche Geschwindigkeit, so dass sie früher oder später alle den gleichen Platz einnehmen, während sie dem Spieler nachjagen. Für den Spieler sieht es so aus, als würden Sie nur von einem Feind verfolgt. Um zu verhindern, dass sie denselben Platz einnehmen, habe ich eine Kollisionserkennung hinzugefügt (eine sehr einfache 2D-Erkennung, die einzige mir bekannte Methode).
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
Das funktioniert gut. Solange ich nur <200 feindliche Wesenheiten habe. Wenn ich mich 300-350 feindlichen Objekten nähere, beginnt meine Bildrate stark zu sinken. Zuerst dachte ich, es wäre schlecht gerendert, also entfernte ich ihren Draw Call. Das hat überhaupt nicht geholfen, und natürlich wurde mir klar, dass es sich um die Aktualisierungsmethode handelte. Der einzige schwere Teil ihrer Aktualisierungsmethode ist dieser Teil, bei dem sich jeder Feind durch jeden Feind schlängelt. Wenn ich mich 300 Gegnern nähere, führt das Spiel eine schrittweise Iteration von 90000 (300 x 300) durch. Mein mein ~
Ich bin mir sicher, dass es einen anderen Weg geben muss, um diese Kollisionserkennung zu erreichen. Obwohl ich keine Ahnung habe wie. Auf den Seiten, die ich finde, geht es darum, wie man die Kollision zwischen zwei Objekten ausführt oder wie man die Kollision zwischen einem Objekt und einer Kachel überprüft. Ich kenne diese beiden Dinge bereits.
tl; dr? Wie nähere ich mich der Kollisionserkennung zwischen LOTS von Entitäten?
Schnelle Bearbeitung: Wenn es um Hilfe geht, verwende ich C # XNA.