Ich würde dies als Kommentar als Antwort auf die Antwort von @Nathan Reed hinzufügen, außer es ist zu groß, um ein Kommentar zu sein, und es ist vielleicht auf jeden Fall wert, eine separate Antwort zu sein.
Wir haben genau das getan, was in seiner Antwort vorgeschlagen wurde, und haben tatsächlich einen Kommentar in der Quelle, die auf diese Seite verweist. Zum größten Teil hat es sehr gut funktioniert, außer dass wir alle zwei oder drei Monate zufällig einen Server verloren haben, der aufgrund der massiven Dauer von Suchanfragen nicht mehr reagiert.
Die Hauptursache des Problems wurde mir bei einer Leistungsprüfung bewusst, um herauszufinden, was dies verursacht hat. Dies ist wahrscheinlich nur dann ein Problem, wenn Sie überlappende Objekte zulassen. In unserem Spiel tun wir dies, und im schlimmsten Fall führt dies gelegentlich zu einem Leistungsspitzen-Tiefenschub.
Wir hatten einen Randfall, in dem ungefähr 100 Objekte, alle mit Begrenzungsscheiben, in sehr unmittelbarer Nähe gruppiert waren. Dies führte zu dem Problem einer sehr tiefen Spitze im Baum, da wir an einem Punkt angelangt waren, an dem Objekte größer waren als der von den Quadtree-Knoten abgedeckte Bereich, sodass jedes neue Objekt in mehreren Knoten angezeigt wurde, was zu einer massiven Unterteilung des Baums führte Baum, wodurch das Problem außer Kontrolle gerät.
Die Konsequenz daraus ist, dass Sie, wenn Sie zulassen, dass sich Objektbereiche überlappen, die Dinge genau beobachten, wenn Sie enge Gruppen von Objekten erhalten, um sicherzustellen, dass Ihr Baum nicht zu tief wird.
Die Lösung, die ich derzeit untersuche, besteht darin, Objekte als Punkte zu speichern und dann bei einer Suche die Grenzen des Suchrechtecks um den im Baum gespeicherten maximalen Radius zu erhöhen. Das sollte für uns funktionieren, da der Baum eine Suche in einem ersten Durchgang ist. Anschließend führen wir zusammen mit einigen anderen Kriterienprüfungen eine wahrheitsgemäße kreisförmige Bereichsprüfung durch, damit die zusätzlichen Fehlalarme herausgefiltert werden.
Ihr tatsächlicher Kilometerstand kann variieren.