Sprites und Objekte laden und entladen ?

  • Sprites und Objekte laden und entladen ?

    Die Frage habe ich vor einiger Zeit schon mal gestellt allerdings ist der damalige Hilfelink mittlerweile aktualisiert worden so das ich da nicht mehr fündig geworden bin.

    Zur Zeit habe ich bei meinem Spiel soviel an Objekten reingepackt das das Spiel teilweise ziemliche Slow Downs hat.
    Daher wollte ich das so gestalten das jeweils nur die Sprites und Objekte geladen sind welche in dem jeweiligen Spielesbschnitt auch benötigt werden.

    Die Hintergründe und Endbosse habe ich jetzt jeweils auch "Load only on Use" gestellt da dieses eh Objekte sind welche jeweils nur 1-2 mal im ganzen Spiel auftauchen so das es da keine Probleme gab.
    Wenn ich aber die Sprites generell daraufhin einstelle ruckt der recht häufig auch mitten im Spiel wenn neue Objekte / Sprites ins Bild gelangen.

    Der Befehl um die Sprites aus dem Speicher zu schmeissen war.
    discard_spritename

    Aber wie das ganze mit Objekten funktioniert oder wie ich die Sprites am Levelanfang in den Speicher reinladen kann habe ich mittlerweile leider vergessen.

    Unabhängig davon, gibt es noch mehr Tricks mit denen man die Engine etwas flotter machen kann. Mittlerweile hat es sich doch gerächt das ich aus Bequemlichkeit alles mit Objekten anstatt Tiles vollgepflastert habe.
    So das ich unabhängig davon versuchen will die Geschwindigkeit so weit wie das noch möglich ist zu optimieren.
  • Wenn ich darf würd ich mir mal die gm6 angucken und gucken wo ich was dran machen kann ^^
    Vielleicht errinnt sich einer an mein Optimier Tutorial inner Db.
    Falls du willst das ich dir beim optimieren helf die datei an Defmaster@gmx.net senden . ^^

    Eine möglichkeit wäre es beim Levelanfang die Ressourcen zu laden und beim beenden wieder zu entfernen.
    Face in the wind, we're riding the storm
    We'll stay our course whatever will come
    ~~ Stay (Running) Wild ~~

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

  • Es gibt noch eine effizientere Methode um Slow Downs zu verhindern.

    Allerdings ist die Methode recht umständlich, aber halt optimal bei Spielen mit etlichen Objekten.

    Du mußt einen Wegpunkt errichten. Das heißt ein Objekt, das bei Berühren vom Spielerobjekt alle anderen instancen im vorgegebenen Bereich erstellt (view_xview z.b.) und wo du eine Variable definierst, die diesen Bereich speichert. (Kannst du ja selbst im Level abmessen)

    Und sobald du aus dem view(und dem variablenwert) raus bis und ein Wert höher ist als die Variable (klar die x koordinate vom playerobject), löscht du alle im variable-befindlichen bereich.

    Ich weiß hört sich kompliziert an, aber je nachdem wie lang deine Level ist und wie weit die x-koordinate des aktuellen views, mußt du halt dementsprechend viele verschiedene "Viewvariablen" einsetzen.

    Und ich denke diese Methode ist für alle diejenigen die Wert auf hohe Geschwindigkeit legen unumgänglich. Ansonsten wäre es wirklich besser wenn man mit Tiles arbeitet und nur die Gegner halt als Objekt darstellt.
    Was man mit Händen baut, kann auch mit Händen zerstört werden...
  • @Magic Hero:

    Ehrlich gesagt klingt das arg kompliziert und ich glaube nicht das ich schon soweit bin das ich das hinbekommen würde. Ich vermute aber wenn ich nur die Objekte und Grafiken im Speicher habe welche grade für einen Abschnitt gebraucht werden das das ausreichen müsste damit das wieder fliessend läuft.


    Original von Defmaster
    Eine möglichkeit wäre es beim Levelanfang die Ressourcen zu laden und beim beenden wieder zu entfernen.



    Wie war der befehl dafür nochmal ?
    ich weiss noch das ich mit Discard_spritenamen
    ein sprite aus dem Speicher nehmen konnte.

    Allerdings kenn ich den Befehl nicht um diese vor Levelbeginn reinzuladen.

    Die meisten sprites haben bei mir die selben Namen wie die Objekte, muss ich die Objekte mit einem Extrabefehl extra entfernen oder gilt das dann für beide ?
  • Dann mache dir wenigstens die Mühe und nimm dir jedes Sprite im Editor vor und bearbeite es mit der Funktion "crop".

    Das heißt, alles überflüssige um das Sprite herum wird abgeschnitten. Je nachdem wie groß so ein Sprite ist, kannst du bist 50% speicherbelastung einsparen!

    Und mein Statement war dieselbe Idee die du verfolgst, allerdings wußte ich nicht das es Befehle zum Auslesen der Sprites aus dem Speicher gibt....

    Oder du nutzt die externe Ressourcenverwaltung!
    Was man mit Händen baut, kann auch mit Händen zerstört werden...

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

  • Also ich glaub wir haben uns Falsch verstanden XD
    Ich meinte du lädst beim Room Start die Sprites von Extern lagernden Dateien.
    Dann setzt du diese für die jeweiligen sprites.
    Dauert nur dann halt beim laden.
    Alleridngs kannst du dann schnell mal nicht benötigte raus aus den Speicher werfen.

    Falls du noch nen paar Tips suchst guck mal in der Database nach meinen Optimier Tutorial
    ode rbei der Tutorials Sektion im Forum.
    Face in the wind, we're riding the storm
    We'll stay our course whatever will come
    ~~ Stay (Running) Wild ~~
  • Original von Defmaster

    Falls du noch nen paar Tips suchst guck mal in der Database nach meinen Optimier Tutorial
    ode rbei der Tutorials Sektion im Forum.


    Das mit dem nur Sprites / Objekte laden welche man nur pro Raum braucht steht da auch bei. Allerdings ist das ja der Befehl den ich suche.

    Die Sachen löschen war discard_namen
    Aber das wieder in den Speicher laden bereitet mir Probleme weil ich den Befehl dafür nicht kenne.
  • Sprite laden mit sprite_add() damit lädst du ein externes sprite dann dieses nurnoch einem objekt verpassen.

    Außerdme preload ausschalten dann wird das sprite erst geladen beim benutzen.
    Kann aber auch ein nachteil sein ^^
    Face in the wind, we're riding the storm
    We'll stay our course whatever will come
    ~~ Stay (Running) Wild ~~
  • Jetzt habe ich im ersten Raum unter Settings, Creation Code benutzt.

    Hier habe ich "discard_muecke" eingegeben da diese erst ab dem dritten Spielabschnitt auftauchen und der Speicher vorerst von den Sprites geleert ist.

    Jetzt zeigt der mir aber die Fehlermeldung an:

    COMPILATION ERROR in room script
    Error in code at line 1:
    discard_muecke

    at position 14:Assignment operator expected.


    Ich hatte jetzt eigentlich vor das vorerst nicht benötigte Sprite aus dem Speicher zu entfernen und mittels
    sprite_add vor dem dritten Raum wieder einzufügen.

    So das nur die Sprites im Speicher sind welche wirklich grade benötigt werden.

    nachtrag:
    Also geplant ist das der die Dateien nicht extern laden muss (wie ich das verstanden habe sind externe Dateien Grafiken welche nicht in der Game Maker EXE mit enthalten sind) sondern diese nur aus dem Speicher legt.

    Ähnlich wie die "Load Only On Use" Option nur das der die Sprites vor dem Raum in den Speicher lädt und nicht während des Raumes.

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