Ressourcen löschen / Speicher freigeben

  • GM 8

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

  • Ressourcen löschen / Speicher freigeben

    Hallo,

    ich habe das Problem, dass ich ein externes Sprite über sprite_add_sprite lade. Nur möchte ich dieses Sprite auch wieder aus dem RAM löschen. Ich hab das mit sprite_delete gemacht. Nur verändert sich der Speicherverbrauch des Spiels überhaupt nicht. Wenn ich das Sprite dann nochmal über einen Tastendruck mit sprite_add_sprite lade vergrößert sich der Speicherverbrauch nochmehr. Gibt es eine Möglichkeit das Bild aus dem RAM zu entfernen, sodass der Speicher wieder frei ist? Sollte doch mit sprite_delete funktionieren, oder? Oder liegt das daran, dass ich das ganze über ein Object mache. Also, dass das Object welches das Sprite verwendet erst gelöscht sein muss. Wobei ich ja beim zweimaligen löschen des Sprites die Meldung bekomme: Trying to delete non-existing sprite.

    Gruß
    Levin
  • Nein. Die CleanMem gibt theoretisch nur unnötig besetzten Speicher frei.
    Manche halten sie für einen unnötigen Blödsinn während andere sie für unverzichtbar und vorteilhaft halten.

    Auf jedenfall ist sie kein komplexes Wunderwerk das irgendwas im GM runner verändern würde sondern sie ruft nur eine gewisse Windows Funktion auf die grosse Speicherbereiche, so genannte pages (wenn ich mich recht erinnere) die der Gm für sich reserviert hat, auflöst.
    Dadurch wird viel Speicher frei. Man weis aber nicht so recht ob die Entwickler des GM's diese Bereiche nur aus doofheit reserviert haben. Halte ich für nicht sehr wahrscheinlich.
    Dadurch könnte es unter Umständen dass ein Spiel durch die Dll langsamer läuft... Dies ist aber nur eine Vermutung.

    Du solltest es aber auf jedenfall versuchen und schlicht mal einen cleanmem-aufruf vor dem Löschen des Sprites machen und den Speicherverbrauch notieren und dann noch einen Aufruf hinterher und schauen ob damit tatsächlich nochmal Speicher frei wird.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

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

  • Man weis aber nicht so recht ob die Entwickler des GM's diese Bereiche
    nur aus doofheit reserviert haben. Halte ich für nicht sehr
    wahrscheinlich.
    Bei .NET wird extra mehr Speicher belegt, weil das zuweisen und wieder freigeben dauert lange, für jede einzelne Variable. Also A. das ist für die Geschwindigkeit oder B. die haben einen großen Memory Leak eingebaut.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Also mit einem größeren Sprite seh ich im Taskmanager, dass er etwas Speicherplatz freigibt. Nur nicht so viel, wie er vorher durch das laden vom Sprite besetzt hat. Letztendlich verbrauch ich beim mehrfachen laden und löschen des Sprites mehr Speicher, als wenn ich es durch die .exe laden lasse.
    Die CleanMem.dll werde ich warscheinlich beim Raumwechsel benutzen.
    Nur wenn ich die dll ausführe, mein Sprite lade und die dll dann nochmal ausführe, ist der Speicherverbrauch genauso groß wie zuvor. Heißt das, dass die dll mein Sprite aus dem RAM entfernt, obwohl es gerade gezeichnet wird?
  • SmiaGOLD schrieb:


    Nur wenn ich die dll ausführe, mein Sprite lade und die dll dann nochmal ausführe, ist der Speicherverbrauch genauso groß wie zuvor. Heißt das, dass die dll mein Sprite aus dem RAM entfernt, obwohl es gerade gezeichnet wird?

    Das definitiv nicht! Die dll löscht nichts aus dem Speicher. Sonst wäre der Sinn der DLL ja verloren.
    Bist du dir ganz sicher dass der Speicherverbrauch genau identisch zu davor ist?
    Seit GM 8 bentzt der GM ja das komprimierte PNG Format welches relativ klein ist. Dass der GM beim Laden eines Sprites wohl mehrere MB's reserviert liegt wohl an dem was henrik1235 gesagt hat und was die DLL beheben kann.

    Und ja.. der Game Maker ist wohl mit memory leaks bespickt. Damit müssen wir uns wohl oder übel abfinden.
    Frage mich allerdings ob das im Studio auch noch so ist.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

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

  • Und ja.. der Game Maker ist wohl mit memory leaks bespickt. Damit müssen wir uns wohl oder übel abfinden.

    Frage mich allerdings ob das im Studio auch noch so ist.
    Das "CleanMemory" Example, erstellt Sprites, jedoch werden die nie verwendet oder überhaupt zugewiesen (sie laufen also ins Nirwana). Jetzt ist es nicht mehr möglich die Sprites zu löschen (bei einem großen Spiel weiß man dann nicht mehr welche Sprites noch gebraucht werden und welche nicht mehr), also immer sprite_delete benutzen wenn der Sprite nicht mehr gebraucht wird. Der Speicherverbrauch steigt bei dem Example dann auch nicht mehr so sehr an.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • DragonGamer schrieb:

    Bist du dir ganz sicher dass der Speicherverbrauch genau identisch zu davor ist?
    Hab das ganze jetzt nochmal getestet. Er liegt tatsächlich etwas über 2 MB drüber, wenn das Bild geladen ist. Jedoch wird nach dem ausführen von der dll der Speicherverbrauch auf ca. 3,5 MB gesetzt, bis er sich dann über Minuten langsam auf seine ca. 5,5 erhöht. (Im Spiel ist in der Zeit nichts passiert)
    Ich werde die sprite_delete Funktion für Sprites benutzen, die ich nicht mehr benötige und nicht mehr laden muss. Die dll werd ich dann noch bei Raumwelchsel benutzen.
  • Ich habe mal die CleanMem DLL in einem Spiel erfolgreich verwendet, immer beim Raumwechsel. So weit ich mich erinnere habe ich dadurch 80-90% Speicher gespart. Das es langsamer wurde, konnte ich nicht feststellen, habe es damals auf einem Netbook getestet. Im nächsten Projekt baue ich es wieder ein. :thumbsup: