selbst generierende Welt , frist nach 2000x2000 zu viel FPS

  • GM 8

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

  • selbst generierende Welt , frist nach 2000x2000 zu viel FPS

    hallo

    ich hab ein problem, Ich hab ein unendlichen 3D 2D raum in dem der boden sich aus 64x64 objekten Blocke wie Gras Wasser Erde Gras usw generiert.
    zusammen ergibt das eine selbst generierte 3D 2D Welt.
    Wo bei sich die Welt in einer Kuppel selbst generiert, damit es nicht zu schnell generiert .
    Die Sachen ist jetzt die bei 2000 x 2000 fläche generierten Blöcken fangt die FPS sehr schnell an, runter zu drehen.
    ich bin gerade am überlegen ob ich mir das Dlc Compiler holle um die leistung auf 100% zu erhöhen.
    kann mir jemand helfen oder hat jemand eine bessere lösung um die leistung zu verbessern

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

  • achso, ich dachte du wärst fortgesrchittener.

    es gibt Funktionen die Objecte Deaktivieren und Aktivieren können.
    deaktivierte Objekte sind für den GM quasi gar nicht da und ziehen so keine Performance

    GML-Quellcode

    1. //Ein typischer deaktivier script
    2. instance_deactivate_all(true)
    3. instance_activate_region(view_xview[0],view_yview[0],view_wview[0],view_hview[0],true)


    den packst du einfach in das step event des Spielers oder von irgendeinem anderen Object was im Raum ist und dann sollten die FPS wieder rapide steigen.
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Larsi ()

  • Ja genau so funktioniert das, aber du solltest dir überlegen, was ein Objekt sein muss und was einfach nur gedrawed werden kann. Ein Kardinalsdellikt von jedem der ein Spiel mit "unendlich" generiertem Terrain macht, alles in Objekte zu zerlegen. Sieh dir, datastructures an. Du kannst zB die Welt in einem ds_grid generieren lassen und dann jeden grid eintrag zeichnen lassen. Ergebnis: nur ein einziges Objekt.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Gib mal "instance_activate_all" ein in der Hilfe vom GM. Von dort aus findest du dann bei "Deactivating Instances" alles was du brauchst.

    Wenn ich z.B. alle Instanzen außerhalb der View deaktivieren will und alle Instanzen,
    die sich innerhalb der View befinden aktivieren, dann sieht der Code z.B. so aus:

    GML-Quellcode

    1. instance_deactivate_region(view_xview,view_yview,view_wview,view_hview,false,true)
    2. instance_activate_object(obj_ship)
    3. instance_activate_region(view_xview,view_yview,view_wview,view_hview,true)

    In dem Fall gibt es ein Objekt, welches von der Instanzdeaktivierung verschont werden soll - obj_ship.
    Das bezieht sich jetzt allerdings auf Views, ich weiß nicht genau was du mit "Kuppel" meinst.
    Das müsstest du uns näher erläutern.

    //edit: Hier schreiben wohl alle auf einmal.^^

    //edit 2:
    Sieh dir, datastructures an. Du kannst zB die Welt in einem ds_grid generieren lassen und dann jeden grid eintrag zeichnen lassen. Ergebnis: nur ein einziges Objekt.

    Du beziehst dich da aber jetzt auf Tiles, nachdem du sagst, man braucht nur ein Objekt.
    Bei Tiles ist das aber nicht zwingend notwendig, da diese sich automatisch deaktivieren wenn sie nicht sichtbar sind.
    Allerdings ist die Variante mit ds_grids zu empfehlen, wenn es um solche Sachen wie zufallsgenerierte Welten geht.

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

  • Larsi
    "ich dachte du wähst fortgesrchittener"
    hab das schon läng deaktierviert, weil ich seit 2 jahren nicht mehr damit gearbeitet hab und viel an erfahrung verloren hab.

    RLP
    " ich weiß nicht genau was du mit "Kuppel" meinst."

    in der Kupple wird die Welt generiert, weil wenn if instance_position(x,y,Kuppel) nicht vorhanden ist dann generiert es die ganze zeit weiter.

    GML-Quellcode

    1. if instance_position(x,y,Kuppel)
    2. {
    3. if not instance_position(x+64,y,blankearth) && not instance_position(x+64,y,purbodenwald) &&
    4. && not instance_position(x+64,y,sandearth) && not instance_position(x+64,y,wasserearth) &&
    5. not instance_position(x+64,y,sumpfearth) && not instance_position(x+64,y,steppenearth) &&
    6. not instance_position(x+64,y,blankearth)
    7. {
    8. instance_create(x+64,y,blankearth)
    9. }


    blankearth prüft dann was um sich ist und verwandelst sich dann in Gras, wasser,sand etc

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Puffin ()

  • Puffin schrieb:

    in der Kupple wird die Welt generiert, weil wenn if instance_position(x,y,Kuppel) nicht vorhanden ist dann generiert es die ganze zeit weiter.

    Gut, aber die Generierung der Welt hat jetzt nicht wirklich etwas mit dem Viewbereich zu tun.
    Wie schaut die Ansicht auf die Spielwelt aus? Topdown? Verwendest du die 3D-Funktionen vom GM oder Fake-3D?

    Wenn es Fake-3D ist würde ich (zumindest zum Testen) die Variante mit instance_deactivate verwenden, und falls noch nicht eingebaut, Views im Room-Editor aktivieren.
    Wenn du es aber wirklich professionell im Sinne von performant machen willst, dann wirst du um Tiles nicht herumkommen.
    Wenn du allerdings selbst mit den instance-deactivate-Funktionen Performanceprobleme hast, dann ist entweder die Map zu groß (für diese Methode),
    oder es befinden sich zu viele (möglicherweise übereinander gelagerte) Instanzen im Sichtbereich.

    Mit der Variable instance_count kannst du sehen wieviele Instanzen momentan aktiviert sind.