Quand un quadtree est-il préférable au hachage spatial?

12

Je fais un jeu de plateforme 2d avec beaucoup d'objets en même temps. Ce sont tous des collisions AABB détectées. J'ai d'abord essayé un quadtree pour diminuer le nombre d'objets à vérifier, essayé quelques configurations différentes, mais cela ne s'est pas avéré aussi efficace que nécessaire. J'ai implémenté un hachage spatial et c'est beaucoup plus efficace, le nombre d'objets à vérifier pour chaque collision a considérablement baissé.

Existe-t-il un cas où la détection de collision 2D utilisant un quadtree est préférable au hachage spatial? Selon mes tests, il semble que le hachage spatial se termine toujours avec moins d'objets à tester pour la collision?

Je n'ai pas fait de chronométrage sur les algorithmes, mais le hachage est-il simplement très coûteux ou difficile à implémenter lorsque vous codez, par exemple, en C? Il convient de noter que j'écris le jeu en javascript, où vous avez le hachage "gratuitement".

Voici la comparaison, ai-je oublié quelque chose? http://zufallsgenerator.github.io/2014/01/26/visually-comparing-algorithms/

Chris
la source

Réponses:

12

Le principal avantage d'un arbre quadruple est qu'il vous permet d'éliminer très rapidement des groupes entiers de godets.

Par exemple, supposons que j'ai un arbre quadruple à six niveaux. À son niveau le plus bas, ce sont des boîtes 32x32; 1024 cases comprenant ce niveau inférieur, le plus détaillé. À titre de comparaison, nous considérerons également un "hachage spatial" - une grille plate qui contient également 32x32 cases, 1024 cases au total. (L'arbre quadruple a plus de 1024 boîtes au total, car il contient également des boîtes plus grandes à ses niveaux supérieurs)

Supposons qu'il n'y ait pas d'objets collables dans le système - toutes les boîtes de notre arbre quadruple et notre grille plate sont complètement vides.

Si vous testez les collisions de quelque chose qui est assez grand pour que sa boîte englobante recoupe toutes ces boîtes et que vous utilisez une grille plate, vous devez vérifier chacune de ces 1024 boîtes pour voir s'il y a même quelque chose dans leur.

Mais si vous utilisez un arbre quad imbriqué, le niveau le plus élevé peut vous dire qu'il n'y a pas d'autres objets dans le système, et donc vous n'avez qu'à regarder cette case pour savoir que vous n'allez pas trouver de collisions plus profondément dans l'arborescence - vous pouvez arrêter immédiatement les tests.

De même, si les objets n'existent que dans certaines régions de l'arbre quadruple, l'arbre quadruple guidera naturellement votre recherche à travers uniquement les cases potentiellement pertinentes, tandis que la grille vous oblige à cocher chaque case intersectée, car vous n'avez aucun moyen de savoir à l'avance quels carrés de la grille contiendront des objets. Si une grande partie de votre arbre quadruple est vide et que vous effectuez des requêtes volumineuses et compliquées (par exemple, d'énormes troncs de caméra au lieu de petits rectangles simples), vous constaterez peut-être que vous parcourez beaucoup moins de cases au total si teste quelque chose en utilisant une structure arborescente plutôt qu'une grille plate. Et cela peut faire une grande différence.

Tout cela ne signifie pas qu'une arborescence est toujours le bon choix, bien sûr. Les grilles plates sont idéales pour la situation que vous avez dans votre exemple - des nuages ​​denses d'objets répartis à peu près uniformément partout dans le monde, et nous faisons des tests de collision simples et peu coûteux. Absolument, une grille est probablement l'approche optimale dans ce cas!

Trevor Powell
la source
5
Résumé laconique, pour les extrêmement paresseux: les Quadtrees manipulent plus rapidement des objets de tailles différentes.
Anko
Merci, c'est une excellente réponse! La taille uniforme des objets était quelque chose que je soupçonnais.
Chris
En fait, vous devrez généralement parcourir tous les niveaux de l'arborescence quadruple pour vérifier s'il n'y a pas d'objets, car en général, un niveau ne contient que des informations sur les objets qui s'inscrivent entièrement dans les limites de ce niveau et ne correspondent pas à un niveau inférieur.
malthe
1
@malthe Si vous insistez pour utiliser une implémentation d'arbre quadruple qui ne peut pas débuter dans ce type de requête, alors utilisez absolument un hachage spatial à la place; vous économiserez 33% du coût de la mémoire, et vous n'en auriez tiré aucun avantage de toute façon. Ou bien, vous pouvez assouplir votre pureté généalogique juste un peu et utiliser un arbre quadruple qui peut être sorti tôt, soit en faisant en sorte que chaque nœud suive le nombre d'entités dans ses enfants, soit en utilisant un arbre quadrillé clairsemé de sorte que les nœuds vides soient dissocié de l'arbre jusqu'à ce qu'ils soient nécessaires. Réellement. Plus de cinq ans plus tard.
Trevor Powell
@TrevorPowell bien sûr, vous avez raison. Je viens de tomber sur votre garantie que vous n'aviez qu'à regarder une seule boîte. Ce n'est tout simplement pas vrai, car vous devrez poursuivre ces comptes. Pour autant que je sache, vous pouvez trouver des collisions plus haut et plus bas dans l'arbre.
malthe