Wenn ich an meinem Spiel arbeite, bin ich an dem Punkt angelangt, an dem ich alle Einheiten der Welt verfolgen muss, damit ich die nächsten Nachbarn für den Kampf überprüfen kann. Dies ist ein RTS-ähnliches Spiel, bei dem sich möglicherweise Tausende kleiner automatisierter Einheiten bewegen.
Ich habe mich mit KD-Bäumen und Quadtrees (insbesondere Point Quadtrees) befasst. Ich versuche immer noch, die Details ihrer Funktionsweise zu erfahren, aber bisher sind Point Quadtrees für mich am sinnvollsten. Ich habe jedoch den Eindruck, dass KD-Bäume schneller zu suchen sind, was bei der Anzahl der Punkte, die ich im Baum habe, wichtig ist.
Andererseits werde ich in meinem Fall eine große Anzahl von Einheiten verfolgen, die sich immer bewegen. Von Bild zu Bild sind ihre Positionen immer unterschiedlich. Quadtrees lassen sich anscheinend schneller neu ausgleichen als KD-Bäume, aber ich weiß nicht, ob dies zutrifft, wenn Sie jeden Punkt im Baum neu ausgleichen .
Ich frage mich, ob es in diesem Fall besser wäre, den Baum in jedem Frame zu verschrotten und von Grund auf neu zu erstellen, als zu versuchen, jeden einzelnen Punkt im Baum neu auszugleichen. Wenn ein Quadtree schneller neu ausbalanciert werden kann, bedeutet das auch, dass er schneller von Grund auf neu erstellt werden kann? Wenn ja, ist dies möglicherweise wichtiger für die Leistung als die Suchgeschwindigkeit des KD-Tree, je nachdem, wie aufwändig das Erstellen des Baums ist, aber ich weiß nicht ...
Lærnes Vorschläge sind großartig, aber ich würde auch einen dynamischen Begrenzungsvolumenbaum von AABBs vorschlagen. Konzeptionell behält der dynamische Begrenzungsvolumenbaum einen ausgeglichenen Knotenbaum bei, der jederzeit nach nahen Elementen abgefragt werden kann, indem ein AABB übergeben und ein überlappendes Paar abgerufen wird. Der Baum wird nicht in jedem Frame neu erstellt. Stattdessen wird der AABB jedes Knotens beim Einfügen in den Baum leicht aufgeblasen, und der Baum wird nur dann neu erstellt, wenn der tatsächliche AABB des Knotens nicht mehr im aufgeblasenen AABB enthalten ist. Ich benutze es in meiner Physik-Engine und es funktioniert großartig.
Der Box2D-Quellcode hat eine großartige Implementierung.
https://github.com/erincatto/Box2D/blob/master/Box2D/Box2D/Collision/b2DynamicTree.h
Hier ist ein guter Überblick über ihre Implementierung:
http://www.randygaul.net/2013/08/06/dynamic-aabb-tree/
quelle