Recentemente, tenho trabalhado em um jogo de tiro em 2D em ritmo acelerado e me deparei com um grande problema. Detecção de colisão. Claro, está funcionando, mas é muito lento. Meu objetivo é: ter muitos inimigos na tela e fazê-los não se tocarem. Todos os inimigos estão perseguindo a entidade do jogador. A maioria deles tem a mesma velocidade; mais cedo ou mais tarde, todos acabam ocupando o mesmo espaço enquanto perseguem o jogador. Isso realmente diminui o fator divertido, pois, para o jogador, parece que você está sendo perseguido por apenas um inimigo. Para impedi-los de ocupar o mesmo espaço, adicionei uma detecção de colisão (uma detecção 2D muito básica, o único método que conheço) que é.
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
Isso funciona bem. Contanto que eu tenha apenas <200 entidades inimigas. Quando me aproximo de 300-350 entidades inimigas, minha taxa de quadros começa a cair bastante. Primeiro, achei que a renderização estava ruim e removi a chamada de empate. Isso não ajudou em nada, é claro que percebi que era o método de atualização. A única parte pesada em seu método de atualização é essa parte de cada inimigo percorre todos os inimigos. Quando chego perto de 300 inimigos, o jogo faz uma iteração de 90000 (300x300). Meu meu ~
Tenho certeza de que deve haver outra maneira de abordar essa detecção de colisão. Embora eu não tenha idéia de como. As páginas que encontro são sobre como realmente fazer a colisão entre dois objetos ou como verificar a colisão entre um objeto e um bloco. Eu já sei essas duas coisas.
tl; dr? Como abordar a detecção de colisões entre MUITAS entidades?
Edição rápida: Se tiver alguma ajuda, estou usando o C # XNA.