Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

11

30.05.2013, 17:15

Ach so, ok. Mein erster Gedanke wäre gewesen die von mir genannten Strukturen erst zur Laufzeit in das 2D Raster um zu rechnen. Also ein Objekt schaffen das sich wie ein z.B. ein Vektor/Array verhält aber einfach nur die Daten aus den Listen verwendet um entsprechend umrechnet.
:love: := Go;

rnlf

Frischling

Beiträge: 85

Beruf: Softwareingenieur Raumfahrt

  • Private Nachricht senden

12

30.05.2013, 17:40

Für sowas würde sich tatsächlich ein Baum anbieten. Beispielsweise könnte man einen Binärbaum benutzten: Immer wenn ein Tile außerhalb der aktuellen Levelgröße erzeugt wird, verdoppelt man die Größe des Levels in dieser Richtung, in dem die Struktur des bestehenden Baumes kopiert und zusammen unter ein neues Wurzelelement gehangen wird. Das ist zwar speicherintensiver, dürfte sich aber, wenn man die Blätter des Baumes nicht als einzelne Tiles sondern kleine Patches von z.B. 32x32 Tiles oder so nimmt, kaum ins Gewicht fallen. Um beim Speichern kann man es immer noch in ein Array überführen.

Und der Zugriff über die Position des Tiles geht dann halt nicht mehr in konstanter Zeit, sondern wächst logarithmisch mit der Anzahl der Ebenen im Baum. Das ist für einen Editor durchaus vertretbar.

Ist allerdings im Vergleich zu 'nem einfachen Array ein gewaltiger Aufwand, besonders wenn du noch nicht so viel Erfahrung hast. Könnte aber auch eine gute Gelegenheit sein, gleich was über Datenstrukturen (in diesem Fall eben Bäume) zu lernen.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

13

30.05.2013, 18:09

Ich hatte da eher an so etwas gedacht:

Quellcode

1
Map<XKoordinate, Map<YKoordinate, List<Asset>>>

Denn wo z.B. eine Reihe leer ist, kann es auch keinen Spalteneintrag geben… folglich auch kein Asset.
:love: := Go;

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

14

30.05.2013, 18:45

Ich denke der Baum ist für sowas eher overhead. Welchen Vorteil würde man daraus ziehen das ganze in so eine Baumstruktur zu packen? Gut ich müsste die alten Elemente nicht umkopieren so wie es zum Beispiel bei einem std::vector der Fall wäre, dafür wäre aber der Aufwand meiner Meinung nach zu groß. Und die Laufzeit sollte einigermaßen egal sein, so würde ich wenn eher zu einer Liste greifen. Für einen Editor sollte die normalerweise mehr als ausreichend sein und dort muss nicht mehr Speicher geholt werden als gebraucht wird. Oder hätte der Baum in diesem Fall einen Vorteil den ich grad nicht sehe?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

15

30.05.2013, 19:01

Also den Vorteil von einem richtigen Baum würde ich jetzt darin sehen, dass man einfacher „komplexe“ Strukturen wieder verwenden könnte. Wie z.B. ein Haus das aus mehreren Tiles besteht. Das geht zumindest nicht so ohne weiteres mit der flachen Struktur wie die die ich genannt hatte.
:love: := Go;

rnlf

Frischling

Beiträge: 85

Beruf: Softwareingenieur Raumfahrt

  • Private Nachricht senden

16

31.05.2013, 09:12

Ich würde sagen, kommt auf die durchschnittliche geplante Größe der Map an. Wenn die sehr groß werden kann, könnte das Umkopieren schon zu einem Problem werden. Aber ich gebe euch recht, es lohnt sich nicht bei relativ kleinen Maps. Allerdings sollte man beim Umkopieren eher die Größe in einer Dimension verdoppeln als bei jedem neuen Klick eine Zeile oder Spalte anzuhängen.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

17

31.05.2013, 10:31

Wobei man bei der Lösung die ich oben sagte ja einfach Indices auf Koordinaten verwenden könnte. Anstatt etwas um zu kopieren müsste man dann nur einen Index einfügen anstatt alles um zu kopieren.
:love: := Go;

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

18

31.05.2013, 10:47

Dafür hast Du ein new pro Tile und cache-feindliche Zugriffsmuster bei jedem Drüberiterieren. Und der Speicher-Overhead einer Map ist auch nicht zu verachten, speziell im Vergleich zu den Nutzdaten, die hier ja nur ein Tile wären.

Nimm ein 2D-Array, oder bau Dir eins aus einem std::vector. Das Vergrößern und Verkleinern ist dann eine Reallokation und Umkopieren, aber das taucht bis zu einer Größe von ein paar Hundert Tiles ins Quadrat nichtmal im Profiler auf. Das Array kannst Du stressfrei auch mit einem internen Koordinaten-Offset ausstatten, so dass Deine Map auch ins Negative wachsen kann. Und dann vergrößerst Du nur in größeren Schritten wie z.B. 16 Tiles auf einmal, und alles ist gut.

Denk aber unbedingt an die multiplen Layer. Nach meiner Erfahrung sind die eher alle als die Map-Größe. Bei Splatter haben wir 8 Tile-Layer, plus einen Layer Trümmer zwischen L3 und L4, einen Layer für editor-platzbierbare Decals (ebenso L3-L4) und einen Objektlayer (ganz oben drauf >L7), wo dann obendrauf aber nochmal extra der Spieler und Partikel draufgepinselt werden. Und selbst das Konstrukt ist bisweilen eng geworden.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

19

31.05.2013, 11:04

Die Layeranzahl könnte man ja im Prinzip auch beliebig gestalten. Tiled unterstützt afair 100 Layer. Da wird man ja erst mal nicht unbedingt beschränkt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

rnlf

Frischling

Beiträge: 85

Beruf: Softwareingenieur Raumfahrt

  • Private Nachricht senden

20

31.05.2013, 11:08

std::map benutzt vor allem auch einen Baum intern. Nur dass du dann pro Tile ein Blatt im Baum hättest, was ganz schrecklich ineffizient wäre.

Werbeanzeige