Ich schreibe ein Spiel, in dem eine große Anzahl von Objekten "Flächeneffekte" über einer Region einer gekachelten 2D-Karte haben.
Erforderliche Funktionen:
Welche Datenstruktur würde dafür am besten funktionieren?
Wenn Sie wirklich viele Flächeneffekte gleichzeitig haben und sie willkürliche Formen haben, würde ich es so machen:
Normalerweise hängt es von der Dichte Ihrer Karte ab.
Wenn Sie wissen, dass jede Kachel (oder ein größerer Teil der Kacheln) mindestens einen Effekt enthält, sollten Sie ein normales Gitter verwenden - einfaches 2D-Kachel-Array.
Wenn Ihre Karte schwach gefüllt ist und viele leere Kacheln vorhanden sind, ist es sinnvoll, einige räumliche Indizes zu verwenden Quad-Tree oder R-Tree oder BSP-Bäume.
Einige Brute-Force-Lösungen, die nicht auf ausgefallene Informatik angewiesen sind:
1000 x 1000 ist nicht zu groß - nur ein Meg. Computer haben Gigs. Sie könnten ein 2D-Array haben. Jedes Bit in den Bytes könnte ein "Typ von Bereich" sein. Der "betroffene Bereich", der größer ist, könnte ein anderes sein. Wenn Sie eine vernünftige Anzahl verschiedener Arten von Bereichen haben, können Sie immer noch eine Multi-Byte-Bitmaske verwenden. Wenn das lächerlich wird, können Sie die Array-Elemente Zeiger auf Listen von überlappenden Bereichstyp-Objekten machen. Aber dann verlierst du die Effizienz.
Sie könnten auch ein Sparse-Array implementieren - indem Sie eine Hash-Taste verwenden, die von den Coords abgesetzt wird (z. B. key = 1000 * x + y) - aber das ist um ein Vielfaches langsamer.
Wenn natürlich, wenn es Ihnen nichts ausmacht, die fancy Informatik Wege zu kodieren, arbeiten sie normalerweise viel besser!
Wenn Sie einen bekannten maximalen Bereich für jeden Flächeneffekt kennen, können Sie eine Datenstruktur Ihrer Wahl verwenden und nur die tatsächlichen Quellen speichern, die für normale 2D-Kollisionsprüfungen optimiert sind.
Wenn Sie dann nach Effekten auf einer Kachel suchen, überprüfen Sie einfach (Kollisionserkennungsstil, optimiert für Ihre Datenstruktur) für alle Effektquellen innerhalb des maximalen Bereichs und wenden Sie dann eine definierte Testfunktion an (z. B. wenn die Fläche a ist Kreis, überprüfe, ob der Abstand kleiner als eine Konstante ist, wenn es ein Quadrat ist, überprüfe, ob die x- und y-Abstände jeweils innerhalb einer Konstanten liegen.
Wenn Sie eine kleine (& lt; 10) Anzahl von Effekt- "Feld" -Formen haben, können Sie sogar eine eindeutige Kollisionserkennung für jeden Effektfeldtyp innerhalb ihrer vorberechneten maximalen Reichweite durchführen.
Tags und Links language-agnostic data-structures spatial