Pracując nad moją grą, jestem w punkcie, w którym muszę śledzić wszystkie jednostki na świecie, aby móc wykonywać kontrole w walce z najbliższymi sąsiadami. Jest to gra podobna do RTS, w której poruszają się potencjalnie tysiące małych automatycznych jednostek.
Patrzyłem na KD-Drzewa i Quadtrees (szczególnie Point Quadtrees). Nadal próbuję poznać szczegóły ich działania, ale jak dotąd Point Quadtrees mają dla mnie jak najbardziej sens. Mam jednak wrażenie, że drzewka KD są szybsze do przeszukiwania, co jest ważne przy liczbie punktów, które będę mieć na drzewie.
Z drugiej strony w moim przypadku zamierzam śledzić ogromną liczbę jednostek, które zawsze się poruszają. Ich poszczególne klatki będą zawsze różne. Czterokąty są najwyraźniej szybsze do zrównoważenia niż KD-Drzewa, ale nie wiem, czy ma to zastosowanie, gdy przywracasz równowagę w każdym punkcie drzewa.
Zastanawiam się, czy byłoby lepiej w tym przypadku po prostu zeskrobać drzewo w każdej ramce i odbudować go od zera, zamiast próbować przywracać równowagę w każdym punkcie drzewa? Jeśli przywrócenie równowagi w Quadtree jest szybsze, czy oznacza to również, że można szybciej budować od zera? Jeśli tak, może to być ważniejsze dla wydajności niż szybkość wyszukiwania KD-Tree, w zależności od tego, jak ciężko jest stworzyć drzewo, ale nie wiem ...
Sugestie Lærne'a są świetne, ale sugerowałbym także dynamiczne drzewo objętości AABB. Koncepcyjnie dynamiczne drzewo woluminów ograniczających zachowuje zrównoważone drzewo węzłów, które można w dowolnym momencie zapytać o bliskie elementy, przekazując AABB i wyszukując nakładającą się parę. Drzewo nie jest przebudowywane w każdej ramce. Zamiast tego AABB każdego węzła jest nieco zawyżone po umieszczeniu w drzewie, a drzewo jest odbudowywane tylko wtedy, gdy rzeczywisty AABB węzła nie jest już zawarty w zawyżonym AABB. Używam go w silniku fizyki i działa świetnie.
Kod źródłowy Box2D ma świetną implementację.
https://github.com/erincatto/Box2D/blob/master/Box2D/Box2D/Collision/b2DynamicTree.h
Oto dobry przegląd ich realizacji:
http://www.randygaul.net/2013/08/06/dynamic-aabb-tree/
źródło