Arbeitsspeicher füllt sich ohne Pause

  • GM 7

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

  • Arbeitsspeicher füllt sich ohne Pause

    Hallo allerseits,
    mal wieder da mit einem Problem was mich überfordert.
    Mein Spiel besteht aus 3 Räumen: Init (30 fps), Titelmenü (30 fps), Spielfeld (60 fps). Die ersten beiden Räume laufen alle normal. Der Speicher wird mit 60 MB belastet. Alle Ressourcen werden extern in das Spiel geladen sobal sie gebraucht werden.
    Sobald ich allerdings das Hauptspiel beginnen will füllt sich der Speicher jede Sekunde um 20 MB und die FPS sackt sofort in den Keller auf 2-1 FPS. Ich habe mir das mal ein paar Minuten angeschaut. Als dann das Spiel 2,7 GB im Speicher eingenommen hat, habe ich es dann dochmal beendet. Die CPU-Auslastung geht auf über 70% hoch wenn der Raum aufgerufen wird.
    Wenn der Raum aktiv ist laufen "nur" 6 Instanzen (es sei angemerkt das die Alphaversion noch mit 118 Objekten arbeitete und nicht mal annährend 2% an Prozessorleistung forderte, ebensowenig überschüttete er den Arbeitsspeicher.

    Was zu wissen ist:
    Ein Objekt ist in dem Spielfeld vorhanden was alles steuert. Es besitzt 1 Create-Event und 1 Draw-Event, kein Step-Event oder so was als zusätzliche Belastung in Frage kommen würde.
    2 Scripte werden aufgerufen. Eins im Create-Event und eins im Draw-Event. Ich habe das Problem eingrenzen können um nicht alle 80 Skripte aufzeigen zu müssen.
    Wenn ich das Script was die Spielsteine zeichnet ausklammere (also deaktiviere) bleibt beim Aufruf des Game-Raums die FPS konstant bei 60 und der Speicher ist wie zuvor auch nur mit 60 MB belastet.
    Ich poste mal den Code des Scriptes was dies scheinbar verursacht:

    GML-Quellcode

    1. var spr, spr1;
    2. for (i = 0; i < zwidth; i += 1)
    3. {
    4. for (j = 0; j < zheight; j += 1)
    5. {
    6. spr1 = ds_map_find_value(global.SteinKoord, "x"+string(i) + "y"+string(j));
    7. spr = sprite_add_alpha(gfx_dir + "steine\" + spr1, subimg,1,0,0,0);
    8. sprite_set_offset(spr, sprite_get_width(spr) / 2, sprite_get_height(spr) / 2); // Der exakte Mittelpunkt aus Höhe und Breite wird ermittelt und festgelegt
    9. draw_sprite(spr, subimg, boardXStart + (steingr * i), boardYStart + (steingr * j));
    10. }
    11. }
    Alles anzeigen

    global.SteinKoord ist eine Map die insgesamt 64 Koordinaten der Spielsteine samt des Namens enthält.
    Die verschachtelten Schleifen sind dazu da alle 64 Koordinaten richtig auszulesen, da die Positionen ja bestimmt sind.

    Ich könnte ja verstehen das wenn das Script in jedem Step aufgerufen werden würde er solche Faxen macht - aber dieses Script wird ein einziges Mal aufgerufen.
    Ich habe dieses Phänomen schonmal damals gesehen - es tauchte auf, als eine Schleife ins unendliche weiterzählte und nicht mehr wusste wann sie aufhören sollte.
    Aber dies ist ja hier nicht der Fall. Die Schleifen sind begrenzt durch meine Konstanten zwidth und zheight die jeweils den Wert 8 enthalten.

    Habe grade echt Tomaten auf den Augen und auch keine Idee was hier verkehrt läuft. Ihr vielleicht ne Idee? ?(
    Danke euch schonmal.

    LG
    zero-tx
    Wenns nach mir ginge bei einem meiner Projekte:

    GML-Quellcode

    1. global.ProgrammNotFinish = 1;
    2. if (global.ProgrammNotFinish)
    3. {
    4. for (i=0; i<5; i += 1)
    5. {
    6. instance_create(x + i,y + i, objzerotx + i);
    7. }
    8. objzerotx1.task = "Erstelle Grafiken";
    9. objzerotx2.task = "Erstelle Sound";
    10. objzerotx3.task = "Erstelle Effekte und Doku";
    11. objzerotx4.task = "Programmiere";
    12. objzerotx5.task = "Kümmer dich um deine Frau!!!";
    13. }
    Alles anzeigen
  • Ach wenns copyboy nicht gäbe :D ...
    Aber sorry - ich erkenne da nicht den Fehler tut mir echt Leid ?( . Wärst du so nett ihn mir zu erklären.
    Du sagst ja jeden neuen Step, aber das Script wird nicht in einem Step aufgerufen...
    Und die Sprites sind ja immer verschieden... Da ja auch die Steine per Zufall bestimmt werden. Diese muss ich ja aus der Struktur auslesen. Ich checks grad net :D
    Wenns nach mir ginge bei einem meiner Projekte:

    GML-Quellcode

    1. global.ProgrammNotFinish = 1;
    2. if (global.ProgrammNotFinish)
    3. {
    4. for (i=0; i<5; i += 1)
    5. {
    6. instance_create(x + i,y + i, objzerotx + i);
    7. }
    8. objzerotx1.task = "Erstelle Grafiken";
    9. objzerotx2.task = "Erstelle Sound";
    10. objzerotx3.task = "Erstelle Effekte und Doku";
    11. objzerotx4.task = "Programmiere";
    12. objzerotx5.task = "Kümmer dich um deine Frau!!!";
    13. }
    Alles anzeigen
  • Du lädst für jeden Stein das Sprite neu (sprite_add_alpha lädt das Sprite von der Festplatte in den Arbeitsspeicher, deshalb braucht das so viel). Du hast doch nicht unendlich viele Steine oder? Du musst einfach irgendwann am Anfang des Spiele in einem Create event alle Steine laden und in Variablen speichern. zB global.stein1=sprite_add_alpha(...) usw. (es müssen natürlich keine globalen variablen sein). Dort setzt du dann auch gleich das Offset, ebenfalls nur einmal ganz am Anfang. Du speicherst ja zurzeit den Dateinamen in die ds_map. Stattdessen speicherst du dort dann die Variable, welche das geladene Sprite enthält, dann steht in der Schleife nur noch:

    GML-Quellcode

    1. spr = ds_map_find_value(global.SteinKoord, "x"+string(i) + "y"+string(j));
    2. draw_sprite(spr, subimg, boardXStart + (steingr * i), boardYStart + (steingr * j));
    “Computers are good at following instructions, but not at reading your mind.” (Donald Knuth)

    Ich schreibe mit Neo.
  • Verstehe so langsam... 8|.
    Darauf wäre ich jetzt echt nicht gekommen... Ich probiere das mal schnell aus, poste auch meine Lösung für die Leute die ein ähnliches Problem hatten oder haben werden, sodaß sie auch gleich wissen was zu tun ist.

    Ich bedanke mich aber schonmal für die freundliche und sachliche Erklärung was genau da passiert ist - bei manchen Sachen sieht man eben den Wald vor lauter Bäumen nicht (komisch... seitdem ich mit GM angefangen habe ist dieser Spruch schon Standard :D).

    Melde mich in ein paar Minuten/Stunden je nachdem :P zurück.

    Grüße
    zero-tx

    [Zusammengeschoben durch CAS]

    So...
    Hat bestens funktioniert, habe es mit globalen Variablen gemacht und einem switch, sodaß ich später für ein spezielles Feature schon gleich die passenden Zuordnungen habe!!! ^^
    Nochmals vielen vielen Dank. Steine werden angezeigt, Speicher und Prozessor bleiben geschmeidig und ich habe die vollen 60 FPS.

    Mal was anderes gefragt, an wen kann ich mich denn wenden wenn es um Animationen geht? Die Thematik ist für mich bislang verborgen geblieben und so richtig verstehe ich sie noch nicht. Ich möchte nämlich das die Steine von oben nach unten in das Spielfeld fallen, Reihe für Reihe und nicht sofort da sind sobald man in das Spielfeld kommt.
    Wo kriege ich denn da mal Profi-Hilfe :)?

    EDIT:
    Sorry, wollte eigentlich das andere Thema editieren und habs verpennt... Man möge einem Brillenträger der seine Brille nicht aufhat verzeihen :D
    Wenns nach mir ginge bei einem meiner Projekte:

    GML-Quellcode

    1. global.ProgrammNotFinish = 1;
    2. if (global.ProgrammNotFinish)
    3. {
    4. for (i=0; i<5; i += 1)
    5. {
    6. instance_create(x + i,y + i, objzerotx + i);
    7. }
    8. objzerotx1.task = "Erstelle Grafiken";
    9. objzerotx2.task = "Erstelle Sound";
    10. objzerotx3.task = "Erstelle Effekte und Doku";
    11. objzerotx4.task = "Programmiere";
    12. objzerotx5.task = "Kümmer dich um deine Frau!!!";
    13. }
    Alles anzeigen