Beste Datenstruktur für ein unveränderliches persistentes 3D-Raster

8

Ich experimentiere mit dem Schreiben eines Spiels in einem funktionalen Programmierstil, was bedeutet, den Spielzustand mit einer rein funktionalen, unveränderlichen Datenstruktur darzustellen.

Eine der wichtigsten Datenstrukturen wäre ein 3D-Raster, das die Welt darstellt, in der Objekte an einem beliebigen Ort [x, y, z] gespeichert werden können. Die Eigenschaften, die ich für diese Datenstruktur haben möchte, sind:

  • unveränderlich
  • Schnelle persistente Updates - d. h. die Erstellung einer neuen Version des gesamten Grids mit kleinen Änderungen ist billig und wird durch strukturelles Teilen erreicht. Das Raster kann groß sein, so dass Copy-on-Write keine praktikable Option ist.
  • Effiziente Behandlung von dünn besiedelten Gebieten / gleichen Werten - leere / unbewohnte Gebiete sollten keine Ressourcen verbrauchen (um große offene Flächen zu berücksichtigen). Bonuspunkte, wenn es auch effizient ist, große "Blöcke" identischer Werte zu speichern
  • Unbegrenzt - kann beliebig in jede Richtung wachsen
  • Schnelle Lese- / Suchvorgänge - d. h. können die Objekte in [x, y, z]
  • schnell abrufen
  • Schnelle Volumenabfragen , d. h. schnelle Suchen durch eine Region [x1, y1, z1] - & gt; [x2, y2, z2] und nutzt idealerweise Sparsity, so dass leere Leerzeichen schnell übersprungen werden

Irgendwelche Vorschläge zur optimalen Datenstruktur?

P.S. Ich weiß, dass dies vielleicht nicht die praktischste Art ist, ein Spiel zu schreiben, ich mache es nur als Lernerfahrung und um meine Fähigkeiten mit FP zu erweitern ......

    
mikera 25.09.2011, 05:18
quelle

1 Antwort

1

Ich würde einen Octtree versuchen. Die Grenzkoordinaten jedes Knotens sind implizit in der Strukturplatzierung, und jeder nichtterminale Knoten behält 8 Teilbäume, aber keine Daten. Sie können so "vereinigen", um Platz zu gewinnen.

Ich denke, dass Unveränderlich und Unbegrenzt (im Allgemeinen) widersprüchliche Anforderungen sind.
Wie auch immer ... um einen Octtree wachsen zu können, müssen Sie die Wurzel ersetzen.

Andere Anforderungen, die Sie stellen, sollten erfüllt werden.

    
CapelliC 25.09.2011 06:48
quelle