En travaillant sur mon jeu, je suis au point où j'ai besoin de suivre toutes les unités dans le monde afin de pouvoir effectuer des vérifications de combat auprès du plus proche voisin. Il s'agit d'un jeu de type RTS, avec potentiellement des milliers de petites unités automatisées se déplaçant.
J'ai étudié les KD-Trees et les Quadtrees (en particulier les Point Quadtrees). J'essaie toujours d'apprendre les détails de leur fonctionnement, mais jusqu'à présent, Point Quadtrees a le plus de sens pour moi. Cependant, j'ai l'impression que les arbres KD sont plus rapides à rechercher, ce qui est important avec le nombre de points que j'aurai dans l'arbre.
D'un autre côté, dans mon cas, je vais suivre un grand nombre d'unités qui sont toujours en mouvement. D'image en image, leurs positions seront toujours différentes. Les Quadtrees sont apparemment plus rapides à rééquilibrer que les KD-Trees, mais je ne sais pas si cela s'applique lorsque vous rééquilibrez chaque point de l'arborescence.
Je me demande s'il serait préférable dans ce cas de simplement supprimer l'arbre de chaque image et de le reconstruire à partir de zéro, plutôt que d'essayer de rééquilibrer chaque point de l'arbre? Si un Quadtree est plus rapide à rééquilibrer, cela signifie-t-il également qu'il est plus rapide à construire à partir de zéro? Si c'est le cas, cela pourrait être plus important pour les performances que la vitesse de recherche de KD-Tree, selon le poids de la création de l'arbre, mais je ne sais pas ...
Les suggestions de Lærne sont excellentes, mais je suggérerais également un arbre de volume de délimitation dynamique d'AABB. Sur le plan conceptuel, l'arborescence de volumes de délimitation dynamique conserve un arbre équilibré de nœuds qui peut être interrogé à tout moment pour les éléments proches en passant un AABB et en récupérant une paire qui se chevauchent. L'arbre n'est pas reconstruit à chaque image. Au lieu de cela, l'AABB de chaque nœud est légèrement gonflé lorsqu'il est placé dans l'arborescence, et l'arbre n'est reconstruit que lorsque l'AABB réel du nœud n'est plus contenu par l'AABB gonflé. Je l'utilise dans mon moteur physique et cela fonctionne très bien.
Le code source de Box2D a une grande implémentation de celui-ci.
https://github.com/erincatto/Box2D/blob/master/Box2D/Box2D/Collision/b2DynamicTree.h
Voici un bon examen de leur mise en œuvre:
http://www.randygaul.net/2013/08/06/dynamic-aabb-tree/
la source