La bonne réponse dépend un peu du jeu réel que vous concevez, et choisir l'un plutôt que l'autre nécessitera vraiment de mettre en œuvre les deux et de faire un profilage pour savoir lequel est le plus efficace en termes de temps ou d'espace sur votre jeu spécifique.
La détection de grille ne semble s'appliquer qu'à la détection de collisions entre des objets en mouvement et un arrière-plan statique. Le plus grand avantage est que l'arrière-plan statique est représenté comme un tableau de mémoire contigu, et chaque recherche de collision est O (1) avec une bonne localité si vous devez effectuer plusieurs lectures (car les entités couvrent plus d'une cellule dans la grille). L'inconvénient, si l'arrière-plan statique est grand, est que la grille peut être plutôt gaspilleuse d'espace.
Si, au lieu de cela, vous représentez l'arrière-plan statique comme une arborescence quadratique, le coût des recherches individuelles augmente, mais comme de grands blocs de l'arrière-plan occupent une petite quantité d'espace, les besoins en mémoire diminuent et donc une plus grande partie de l'arrière-plan peut se trouver dans le cache. même s'il faut 10 fois plus de lectures pour effectuer une recherche dans une telle structure, si tout est dans le cache, ce sera toujours 10 fois plus rapide qu'une simple recherche avec un échec de cache.
Si j'étais confronté au choix? J'irais avec l'implémentation de la grille, car c'est stupide et simple à faire, mieux vaut passer mon temps sur d'autres problèmes plus intéressants. Si je remarque que mon jeu tourne un peu lentement, je vais faire un profilage et voir ce qui pourrait utiliser de l'aide. S'il semble que le jeu passe beaucoup de temps à détecter les collisions, j'essaierais une autre implémentation, comme un quadtree (après avoir épuisé toutes les corrections faciles d'abord), et chercher si cela a aidé.
Edit: Je n'ai aucune idée du lien entre la détection de collision de grille et la détection de collisions de plusieurs entités mobiles, mais à la place, je répondrai comment un index spatial (Quadtree) améliore les performances de détection par rapport à la solution itérative. La solution naïve (et généralement parfaitement fine) ressemble un peu à ceci:
foreach actor in actorList:
foreach target in actorList:
if (actor != target) and actor.boundingbox intersects target.boundingbox:
actor.doCollision(target)
Cela a évidemment des performances autour de O (n ^ 2), avec n le nombre d'acteurs qui sont actuellement en vie dans le jeu, y compris les balles et les vaisseaux spatiaux et les extraterrestres. Il peut également comprendre de petits obstacles statiques.
Cela fonctionne parfaitement bien tant que le nombre de ces articles est raisonnablement petit, mais commence à paraître un peu pauvre lorsqu'il y a plus de quelques centaines d'objets à comparer. 10 objets résultent en seulement 100 contrôles de collision, 100 résultats en 10 000 contrôles. 1000 entraîne un million de chèques.
Un index spatial (comme les arbres quadruples) peut énumérer efficacement les éléments qu'il collecte en fonction de relations géométriques. cela changerait l'algorithme de collision en quelque chose comme ceci:
foreach actor in actorList:
foreach target in actorIndex.neighbors(actor.boundingbox):
if (actor != target) and actor.boundingbox intersects target.boundingbox:
actor.doCollision(target)
L'efficacité de ceci (en supposant une distribution uniforme des entités): est généralement O (n ^ 1,5 log (n)), car l'index prend environ log (n) comparaisons à parcourir, il y aura environ sqrt (n) voisins à comparer , et il n'y a pas d'acteurs à vérifier. En réalité, cependant, le nombre de voisins est toujours assez limité, car si une collision se produit, la plupart du temps l'un des objets est supprimé ou éloigné de la collision. vous obtenez donc juste O (n log (n)). Pour 10 entités, vous faites (environ) 10 comparaisons, pour 100, vous en faites 200, pour 1000 vous en faites 3000.
Un index vraiment intelligent peut même combiner la recherche de voisin avec l'itération en bloc et effectuer un rappel sur chaque entité qui se croise. Cela donnera une performance d'environ O (n), car l'index est analysé une fois plutôt que d'être interrogé n fois.