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

1

25.08.2008, 09:38

[Erledigt] Handling eines Map arrays

Hallo liebe Community,

ich suche nach einer eleganten, Speicher schonenden und Plattformunabhängigen Lösung wie ich ein Map/Tile array mit variabler Tilegröße handlen kann.

Die größe eines Tiles kann je nachdem welchen Typ es hat (Feld, Wald, Straße,...) zwischen 2-10 byte sein.

Folgende Lösungen kammen mir schon in den Sinn:
[list]Union-array
Nachteil: Je nach Typ werden pro Tile bis zu 8 byte verschwendet.[/list][list]Klassen-array
Vorteil: Virtuelle Funktionen usw. sind schon nett.
Nachteil: Noch größere Speicherverschwendung, 4/8-Byte (32/64-bit system) durch den Zeiger und dann noch mal bis zu 3/7-bytes durch die "aufrundung".[/list][list]Datenbank (wie ich hier im Forum auch schon gelesen habe gerne genommen)
Vorteil: So weit ich weiß sollte jedes Tile nur den Speicher einnehmen, den es benötigt.
Nachteil: Nicht Plattformunabhängig. Ich möchte "überall"(*1) compilieren können ohne eine große Bibliothek portieren zu müssen.[/list]Da die Karten schon sehr groß werden können, sollte die Speicherverschwendung minimal bis gar nicht sein.

Ich hoffe, dass einer von euch eine(n) gute(n) Idee/Vorschlag hat, oder Denkfehler (sofern vorhanden) von mir berichtigen kann.

Danke schonmal,
BäckerBob

*1: Mit "überall" mein ich neben Linux/Mac/Unix/Windows auch zB. MorphOS, iPhone und ähnlichem.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

25.08.2008, 10:06

Du wirst keine Lösung finden die für jede verfügbare Platform optimal funktioniert. Ich würde dir zu deinem 2. Vorschlag raten, ganz einfach weil die Idee sich am elegantesten und schönsten umsetzen lässt.
@D13_Dreinig

3

25.08.2008, 11:55

Ich hatte mir auch noch eine 4. Möglichkeit überlegt, mehrere arrays. Ein Hauptarray in dem dann z.B. die Höhe, der "Bodenbelag" und der Typ des Tiles stehen. Und dann für jeden Typ ein eigenes array, in dem dann neben den eigendlichen Daten auch noch das Tile steht (als integer).

Mal abgesehen, dass dadurch (Tile-Nr.) 4 Bytes draufgehen, müsste jedesmal wenn z.B. im Hauptarray "Straße" steht das komplette Straßen-array nach der richtigen Tile-Nr. abgesucht werden (zumindest fällt mir keine andere Lösung ein). Und das wäre für jedes sichtbare Tile bei jedem Frame, beim Pathfinding, ... doch einiges an Rechenzeit.

Zudem müsste (hab mich nicht so intensiv mit dem Mechanismus hinter malloc/calloc/realloc beschäftigt) jedesmal wenn ein Tile seinen Typ ändert 2 Arrays durch den Speicher geschoben werden.

Zitat von »"David_pb"«

Ich würde dir zu deinem 2. Vorschlag raten, ganz einfach weil die Idee sich am elegantesten und schönsten umsetzen lässt.

Im Grunde auch mein Favorit. Aber allein durch den Zeiger würden bei einem 64-bit System und einer Karte von 2048*2048 32MiByte für im Prinzip Nichts benötigt. Darum wäre ich auch für nicht ganz optimale Lösungsvorschläge dankbar.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

25.08.2008, 11:58

Zitat von »"BäckerBob"«


Zitat von »"David_pb"«

Ich würde dir zu deinem 2. Vorschlag raten, ganz einfach weil die Idee sich am elegantesten und schönsten umsetzen lässt.

Im Grunde auch mein Favorit. Aber allein durch den Zeiger würden bei einem 64-bit System und einer Karte von 2048*2048 32MiByte für im Prinzip Nichts benötigt. Darum wäre ich auch für nicht ganz optimale Lösungsvorschläge dankbar.


Und? Wer ein 64 Bit System betreibt wird wohl 32 Megabyte übrig haben... Außerdem verbrauchst du den Speicher nicht für "Nichts", du verbrauchst ihn für die Zeiger auf deine Tilestrukturen.

Wie Knuth schon sagte:

Zitat von »"Donald Knuth"«


We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.
@D13_Dreinig

5

25.08.2008, 12:29

Zitat von »"David_pb"«

Und? Wer ein 64 Bit System betreibt wird wohl 32 Megabyte übrig haben... Außerdem verbrauchst du den Speicher nicht für "Nichts", du verbrauchst ihn für die Zeiger auf deine Tilestrukturen.

Das "Nichts" war auch nicht so negativ gemeint. Was den Speicherverbrauch angeht denke ich da schon etwas weiter. Da jedes Tile ja min. 1 Byte an Informationen hat wären es schon 64MiB+ . Bei einer 4096*4096 Karte schon 256MiB+ an benötigten Speicher allein durch die Karte.


Zitat von »"David_pb"«

Wie Knuth schon sagte

Da musste ich aber erstmal Wikipedia fragen wer das überhaupt ist :) .

Aber du hast natürlich Recht. Ich zerbreche mir schon seit einiger Zeit den Kopf ob es nicht etwas besseres gibt was ich übersehe/nicht finde. Und da klammere ich mich nun gerade an den Strohhalm, dass einer von euch die Idee welche hat.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

6

25.08.2008, 14:00

Also wer sich nen 64bit System zulegt bevor er 2 gig Ram dazu hat is selbst schuld - konzentrier dich bei deinen Überlegungen lieber auf die Begrenzungen von iPhone und was du sonst noch an besonderen Platformen unterstützen willst und nicht so sehr auf die paar Leute die ihren PC nicht verstanden haben - dafür gibts mindest-Systemanforderungen und Fehlermeldungen bei vollem Speicher^^

Werbeanzeige