Speicher-Reservierung eines 2D Array's

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Speicher-Reservierung eines 2D Array's

    Hallo Freunde.

    Ich bin vor Kurzem ueber einen Beitrag gestolpert, indem jemand in seinem GML Code 2-dimensionale Arrays verwendet:

    e.g.

    Quellcode

    1. global.player[0,6]


    Nun hab ich in der Hilfedatei gelesen, dass eine 1-dimensionales Array 1000000(maximale Stellen)*32000(fuer jede Stelle) an bytes reserviert, oder reservieren kann?.

    In Sachen Speichereffizienz, ist es beim GM manchmal schwierig zu sehen, ob Datenmanagement tatsaechlich so vom Rechner umgesetzt wird, wie im Handbuch (Hilfedatei) beschrieben, da man bei Strings im Memory teilweise sehen kann, dass diese als CHAR behandelt werden, und trotzdem nicht die gleiche Groessenzuordnung erhalten...nun bin ich etwas durcheinander und verunsichert, besonders, wenn es um 2d-Arrays geht... Ich sage schonmal vorab, ich habe keine Ahnung, vor was genau ich hier stehe...

    ...daher...

    Meine Fragen:

    -Wird bei einem 2D Array der reservierte Speicherblock quadriert also (1000000*32000)*(1000000*32000)?

    -In welchem Fall sollte man 2D Arrays einsetzen?

    -Ist eine Stelle im Index (also nicht der Speicher ZU dem Index) ein Byte oder ein INT (ich weis, das ist bestimmt eine laecherliche Frage, aber ich kann's nicht in Wikipedia nachlesen, weil das im GM schonwieder was anderes sein kann)?

    -Werden Strings im Array auch solche zugeordnet, oder sind das jetzt CHARs (also, ich weiss nich, ob jetzt Strings auch wirklich eine Einheit im Op-Code sind, oder was jetzt???)

    -Gibt es einen Unterschied zwischen DS-Lists und Arrays? Und wenn ja, was ist effizienter?

    -Warum gehen Ziegen nicht als Schafe durch?



    Danke
  • Gleich knallt's schrieb:

    -Gibt es einen Unterschied zwischen DS-Lists und Arrays? Und wenn ja, was ist effizienter?

    Da du von 2D Array redest, aber hier aufeinmal von Lists redest, möchte ich dich hierraus aufmerksam machen, weil es den anschein erweckt, als wärst du dir über diese Datenstruktur nicht bewusst: ds_grid. Ich würde diese Datenstruktur solange bevorzugen, bis du damit irgendwo ein Problem bekommst ...
  • Der GM reserviert soviel Speicher, wie er für die definierte Datenstruktur maximal brauchen würde (wenn alle Werte belegt wären)
    Diese Monsterzahlen sind maximalgrößen, die man wohl so gut wie nie ausreizen dürfte.
    Was die Wahl der verwendeten Datenstruktur angeht, kommt es darauf an, was man bezweckt.
    ds_grid ist schon ziemlich genial, ich stell mir das in der Form einer Exel-Tabelle vor (jede Zelle hat eine Zeilen- und Spaltenkoordinate),
    allerdings sind auch die anderen Datenstrukturen je nach Anwendungszweck sehr gut einsetzbar z.B wenn man eine ds_map erstellt kann man die Adressierung mit Strings machen, was die Übersichtlichkeit im Code ungemein erleichtert (weil ein Schlüssel z.B "player_name" heißt und nicht nur eine Indexzahl ist.)
    Fazit: Es lohnt sich, die Hilfeseiten zu den Datenstrukturen gut durchzulesen und zu überlegen, welches Ziel man damit verfolgen möchte.
  • @boxxar: Also ich muss schon sagen, die Sache mit dem ds_grid klingt sehr gut (davon hatte ich bis jetzt noch nichts gehoert). Bedeutet das, dass ich quasi eine art 2d Array mit einer vorbestimmten Groesse erschaffen kann, wo im Gegenzug das standart Array durch eine einzige Zuordnung bereits das volle potential reserviert? In der Hilfedatei, wird davon naemlich nichts erwaehnt... und ich finde, dass die Identifikation und Zuordnung wesentlich aufwendiger ist als bei einem Standart 2d Array.

    Danke fuer den Tipp.

    @Nekaida: Viele Sachen im Bezug auf kleine aber wichtige Details steht nicht in der Hilfedatei (siehe meine Frage im Bezug auf Unterschied zwischen 2d Array und ds_grid @boxxar). Die verraten dir zwar, was'de alles tolles zuweisen kannst, aber mit keinem Wort steht etwas zur direkten Architektur , oder wie die Funktion sich von der Pseudo-kompilierten EXE auf den Speicher auswirkt. Danke fuer deinen Beitrag. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Gleich knallt's ()

  • @boxxar: Also ich muss schon sagen, die Sache mit dem ds_grid klingt sehr gut (davon hatte ich bis jetzt noch nichts gehoert). Bedeutet das, dass ich quasi eine art 2d Array mit einer vorbestimmten Groesse erschaffen kann, wo im Gegenzug das standart Array durch eine einzige Zuordnung bereits das volle potential reserviert? In der Hilfedatei, wird davon naemlich nichts erwaehnt... und ich finde, dass die Identifikation und Zuordnung wesentlich aufwendiger ist als bei einem Standart 2d Array.


    Stimmt genau. ein Grid könnte man als ein 2 Dimensionales Array sehen. Blos mit dem Unterschied dass du 1. mehr Kontrolle über den Speicher hast und 2. Funktionen wie z.B: das kopieren des kompletten Arrays zur verfügung stehen.

    Ich benutze "normale" Arrays nur für simplen sachen um z.B: Button IDs (für z.B: Menüs) zwischenzuspeichern und sie durch den Index leichter ansprechen zu können.
    Grids hingegen benutze ich für komplexere Dinge.
    So setze ich bei meinem Spiel auch komplett auf Grids, da ich die kontrolle über den RAM brauche. (Schon allein die Möglichkeiten das Komplette Grid auf ein anderes zu kopieren ohne mit einer For schleife die arrays durchlaufen zu müssen und das Grid ebenso komplett zu löschen...)
    Ehrlich gesagt kenn ich mich bei der Speicherverwaltung des GMs nicht so gut aus. So weiss ich nicht wie man eine bestehende Variable/Datenstrucktur aus dem Ram wieder entfernen kann. (Java z.B: macht das automatisch mit dem "Garbage Collector".)

    Grids kann man dabei nach belieben erstellen, füllen, kopieren und sie sogar nach dem erstellen wieder löschen. > Speicher wird frei.

    Jedoch habe ich von anderen Usern gehört das Grids langsamer sein sollen als Arrays. Dies soll sich aber nur bei rechenintensiven Algorithmen zeigen. (z.B: das Generieren von Maps)

    Wenn du die kontrolle über den Speicher also wirklich brauchst, würde ich auf Grids setzen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

  • LEWA schrieb:

    Jedoch habe ich von anderen Usern gehört das Grids langsamer sein sollen als Arrays. Dies soll sich aber nur bei rechenintensiven Algorithmen zeigen. (z.B: das Generieren von Maps)

    Ich habe vor kurzem einen Performancevergleich durchgeführt (auch um die unterschiede zwischen GM7, 8 und 8.1 zu testen), es gibt keine wesentlichen Unterschiede, beim GM7 war der Unterschied zwischen Grids und Arrays noch größer aber da waren Grids schneller als Arrays. Beim GM8.1 unterscheiden sie sich nicht mehr allzustark.

    © 2008 by Teamgrill Productions