Performanceprobleme mit Instancen

  • GM 8

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

  • Performanceprobleme mit Instancen

    Hallo an alle

    Ich habe folgendes Problem:

    Bin dabei in Spiel für den Adventskalender zu machen.
    Jetzt habe ich einen Room von 2048x960 größe mit ziemlich viel Instancen, was zur Folge hat das das Spiel ziemlich langsam läuft. Eben wegen den vielen Instancen im Room.
    Habe mir gedacht das ich es mit folgenden Code der jeweiligen Instance beheben könnte

    Alle Instanzen ausserhalb des Views zu deaktivieren

    GML-Quellcode

    1. {
    2. instance_activate_all();
    3. instance_deactivate_region(view_xview[0],view_yview[0],view_wview[0],view_hview[0],false,true);
    4. }


    Was auch ohne Problem geht. Das Spiel läuft wieder flüssig.

    Mein Problem liegt darin, wenn ich meine Spielfigur bewege und der View folgt der Figur, werden die Instancen wieder aktiviert die außerhalb des Views lagen. Nur werden sie nicht wieder dort hin gesetzt wo sie vorher waren. Mache war sogar in der Wand drinnen.

    Jetzt meine Frage:
    Hat einer von euch eine Bessere Lösung für mein Problem, damit mein Rechner nicht lahmt bei zu vielen Instancen.
    Gruß
    Drachen :)

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

  • Ich hab soetwas zwar nochnie versucht, doch: du aktivierst erst alle instances, und deaktivierst dann die die in der view sind? sollte das nicht andersrum geschen?
    Aber abgesehn davon: Ich würde da nciht mit view arbeiten, sondern, alle instances die außerhalb eines radiuses liegen deaktivieren, und ich kenn dein spiel zwar nicht,
    doch falls die instancen nur wände etc. sind, akn man sie beim romm start zu einen instance zusammenfasse, indem sicha lle instancen auf das sprite eines master objects drawen und dann löschen (surfaces). Eine andere möglichkeit wäre das spiel in verschiedene räume zu unterteilen, oder die instances, falls sie simple gegner sind, in einem grid zu speichern, und komplett zu löschen, bzw. neu zu erstellen wenn sie in reichweite kommen.
  • Hi

    Danke für deine Antwort

    Das Spiel ist ein Boulder Dash Klon.
    Den GML-Code habe ich in der Hilfedatei des Game Makers über Instancen gefunden.
    Werde das mal mit dem Grid speichern ausprobieren.

    Was ich nicht ganz verstehe ist wie du das mit dem drawen meinst. Das Spielfeld erstelle ich doch mit dem Roomeditor. Hier setzt ich alle Objekte rein die ich im diesen Level benötige. Sprich Wände, Gegner, Steine usw. So kann es schon mal sein das von ein Gegnertyp ca. 10 - 20 im Raum vorhanden sind.

    Hätte nicht gedacht das so ein einfaches Spiel, so viel Probleme bereiten kann.

    Gruss
    Drachen :)
  • Das Problem ist wahrscheinlich, dass die Wände schon außerhalb des Views sind, die Gegner aber nicht, so dass die Gegner sich in die entsprechenden deaktivierten Wände bewegen können. Einzige Möglichkeit ist also, dafür zu sorgen, dass die Gegner den kleinsten Deaktivierungsradius haben.
  • Also wenn deine Wände statisch sind, kann man eine jede menge instancen spaaren indem man sie "zusammenfasst".
    Hierzu erstellt (am besten der spieler) beim raum start (room start event) ein instance, von einem master object mit dem alle collisionen laufen.
    HIER ein beispiel.
    Im raum editor sind ganz viele wände, allerdings siehst du im debug mode das nur 2 instances laufen, da alle wände und deren masks zusammengefügt werden.
  • Hi
    Hellfish:
    Werde das mal probieren.

    Choas Creator:
    Wie kann ich das mit kleinsten Deaktivierungsradius für meine Gegner einstellen ?
    Da man doch nur Bereiche einstellen kann. Oder habe ich das in der Hilfe falsch verstanden !

    Vielen Dank für eure Hilfe. Wenn es geklappt hat, werde ich es hier Posten.
    Gruss
    Drachen :)
  • Da müsstest du machen:

    - Alle, die weit außerhalb des Views liegen, deaktivieren
    - Alle Gegner deaktivieren
    - Alle (Gegner) innerhalb des Views aktivieren

    Das geht auf jeden Fall, ob man instance_deactivate_region() nur auf ein Objekt anwenden kann, weiß ich nicht
  • Hi Choas Creator

    Das werde ich mal morgenfrüh gleich mal Testen. Das hört sich sowas von Gut An

    Gruss
    Drachen :D
    =========================================================================================================================================================================================

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Drachen ()

  • Hi
    Habe das jetzt mal getestet was mir Choas Creator vorgeschlagen hat.
    Das Ergebnis war nicht so sonderlichlich Gut. Also das mit instance_deactivate_region() ist mir zu ungenau. Egal wie groß ich die Region mache, man sieht immer am Rand das was deactiviert wird.

    Jetzt habe ich mir mal das von Hellfish ins Auge gefaßt. Auch die Idee ist gut, alle Teile die am meisten vorhanden sind, zusammen zu einer Instance fassen.
    Aber ein Problem habe ich dann auf jedenfall.
    Wie kann ich dann den Hintergrund löschen da wo der Spieler hin läuft.
    In meinen Fall der grüne Hintergrund siehe Bild.



    Gruss
    Drachen
  • genau wie ich aufs surface gemalt habe, halt nur den draw modus auf substract setzten.
    Mehr dazu sollte in der hilfe stehn (du musst den draw modus danach aber wieder auf normal setzten, sonst wird alles subtrahiert was du malst)
    Also auf substract setzten, und wie es aussiehst orientieren sich deine instancen an eiem grid, also auf diesem grid an der richtigen stelle, den surface löschen (und den mask surface) und dann weider auf normal setzten.

    hoffe damit kannst du was anfangen, wenn nicht kann ich dir noch ein beispiel machen
  • Hi Hellfish

    Habe jetzt mal deinen Code genau angeschaut und auch in der Hilfe gelesen, aber schlau bin ich nicht daraus geworden. Habe auch im Netzt nach Beispiele gesucht. Hab aber nichts gefunden.
    Jetzt bin ich noch mal auf deine Hilfe angewiesen. Mach mir mal ein Beispiel wie das funktionieren sollen. Muss auch zugeben das ich vorher nie was mit surface gearbeitet habe.
    Für deine Hilfe schon mal vielen Dank. Sonst hätte ich das Spiel wohl an Akta legen können.

    Gruss
    Drachen :)