Performance bei Supermarkt Simulation

    • GM 8

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

    • Performance bei Supermarkt Simulation

      Hallo ihr,

      ich habe zum Thema Performance schon so einiges gelesen, wollte diese Frage aber trotzdem mal stellen. Ich habe bereits vor mehreren Monaten damit angefangen, eine Simulation eines Supermarktes zu erstellen, hatte dann mal wieder aufgehört, weil ich keine sinnvoll zu realisierende Möglichkeit gesehen habe, einen Artikelstamm aufzubauen, um möglichst einfach neue Artikel mit x - Eigenschaften einzupflegen. Eventuell auch mit der Möglichkeit für den user selbst neue Artikel einzupflegen.

      Da ich dies nun gelöst habe, stellt sich nun die "leidige" Frage der Performance. Wir reden hier im Extremfall über mehrere tausend Objekte (Artikel), die zwar nicht alle gleichzeitig angezeigt werden müssten, aber trotzdem in der GM - Datei vorhanden sein sollen, damit man mit ihnen interagieren kann. Außerdem gibt es Kunden, die sich durch den Laden zu den Artikeln (nur zu den Regalen) bewegen müssen und jeder eine eigene Einkaufsliste besitzen. Klar, vielleicht ließen sich ja auch extern die Objekte speichern und dann auch diese nur laden, wenn sie wirklich benötigt werden, vielleicht über execute_file, wobei ich damit noch keine Erfahrung habe.

      Nun ist klar, dass ich alle größeren sprites (wie die der Artikel) schonmal extern speichere und nur lade, wenn sie auch benötigt werden, allerdings kann ich ja zB keine Instanzen von irgendwas deaktivieren wenn sie aus dem view sind, weil die Kunden ja trotzdem mit den Artikeln interagieren müssen. Eine Möglichkeit wäre noch, die Kollisionsabfrage per mp_potential_step nur dann zu verwenden, wenn sich der Kunde im view befindet und sonst nur move_towards_object zu verwenden, das sollte ja auch etwas einsparen. Trotzdem weiß ich nicht, was wäre, wenn ein Kunde dann zB in dem Moment in den view kommt, während er gerade beim durchqueren einer anderen Instanz ist.

      Ich würde mich über jeglichen Input zur Sache freuen!

      Viele Grüße, Benny
    • Was zur performance

      Also schon mal was wegen der Wegfinung.
      Leider konnte ich jetzt nicht herauslesen in welcher ansicht das spiel stattfindet.
      Wenn ich würde dir da ide ANsicht wie im RPG maker emfehlen. also keine Iso sicht von ca 30grad sondern alles gerade.
      Beispiel

      Denn dann würde ich dir die Funktion mp_grid_path nahelegen. Alle kunen bewegen sich so schön gerade auf einem Raster. Und dort wo hindernisse sind, wie regale kanst du ja die Grid(raster) löschen.
      Denn mp_potetionial_step ist wohl der PC killer schlecht hin. Und sieht uach doof aus wegen dem ganzen rumgezucke der Objekte.

      Artikel in Regale zusammen fassen

      Witziger weise ist das eine Passende Metapher.
      Denn um Artikel Instance einzusparen würde ich sie in in einem Regal zusammen fassen. Pro regal"je nach dem Welcher Typ" wird es ja sicherlich mehr als nur 2 oder 3 Artikel geben.
      Wenn ein Kunde eitwas sucht bekommt er also die Rgal nummer"id" und vor ort interagiert er mit dem regal und dessen Inhalt.

      natürlich kommt da ein wenig arbeit auf dich zu da du hier genau wie im echten super markt eine art bar code system schreiben must. Wenn du die Regale zb mit anderen artikel füllen willst müssen natürlich auch gewissen werte im Regal geändert werden.
      Wen nein reag lzb 4 Artikel umfäst dann speichert es also den Typ und die Anzahl im regal.

      Lästieges suchen vermeiden " Performance"
      Um einen artikel finden zu wollen könnte man jetzt natürlich alle regale mit einer for schleife überprüfen ob sie den gesuchten artikel in sich tragen.
      Das ist aber bei ca 100 Kunden im Supermarkt warscheinlich extrem langsam.

      Einfacher ist es eine Artikelliste anzufertigen wo hinter jeden artikel die Regal nummer zufinden ist.
      Zb du änderst im Spiel in einem Regal den inhalt von Produkt A auf Produkt B. Dann wird in der Produktlöiste auch gleichzeitig bei Produkt B die Regal.id eingetragen.
      Jetzt bruacht der kunde nur noch die Produkt/Regal_id aus der list nehmen und geht zum regal hin.

      Sofern ich das jetzt alle richtig interpretiert habe mit dem supermarkt
      Meine Signatur hat kein Visum für das GM Forum erhalten.
    • Der Knackpunkt ist, statt vielen Objekten nur 2-3 zu verwenden.

      Du kannst alle Artikel in ein Objekt packen, kein Problem. Benutze Listen dafür, die sollten mit am schnellsten sein.

      Du kannst alle NPC Kunden in ein einziges Objekt packen, das ist auch möglich und hier vielleicht wünschenswert.
    • x-sascha schrieb:

      Also schon mal was wegen der Wegfinung.

      Artikel in Regale zusammen fassen

      Witziger weise ist das eine Passende Metapher.
      Denn um Artikel Instance einzusparen würde ich sie in in einem Regal zusammen fassen. Pro regal"je nach dem Welcher Typ" wird es ja sicherlich mehr als nur 2 oder 3 Artikel geben.
      Wenn ein Kunde eitwas sucht bekommt er also die Rgal nummer"id" und vor ort interagiert er mit dem regal und dessen Inhalt.

      ""

      Einfacher ist es eine Artikelliste anzufertigen wo hinter jeden artikel die Regal nummer zufinden ist.
      Zb du änderst im Spiel in einem Regal den inhalt von Produkt A auf Produkt B. Dann wird in der Produktlöiste auch gleichzeitig bei Produkt B die Regal.id eingetragen.
      Jetzt bruacht der kunde nur noch die Produkt/Regal_id aus der list nehmen und geht zum regal hin.


      Derart hatte ich mir das auch gedacht :thumbsup: . Sehr schön. Das mit mp_grid muss ich mir mal anschauen...das ganze ist rein 2D topdown.

      Das mit den Objekten für die Artikel muss ich mir nochmal überlegen...im Moment habe ich wie gesagt eine Datenbank (Tabelle), die beliebig mit Artikeln erweiterbar ist. Im Moment habe ich nur 4Obst/Gemüse Artikel/Objekte und implementiere damit alle Funktionen...für Obst/Gemüse will ich eigentlich schon gern gesonderte Objekte nehmen, weils hier sehr individuell zugeht. Für den Rest Trockensortiment sollte es wohl möglich sein nur ein Objekt zu erstellen, welches dann zentralgesteuert, je nach Regal, zu einem Artikel wird.

      Trotzdem auch nochmal die Frage, ob es theoretisch möglich ist per execute_file und object_add von extern Objekte zur Laufzeit zur laden und ob sich dadurch ein Geschwindigkeitsgewinn ergeben würde, als wenn die Objekte bereits in der gm-Datei vorhanden sind und immer mit geladen werden.

      Vielen Dank schonmal für eure Hilfe!

      Gruß, Benny
    • Naja das Execute_file ist vollkomemn überflüssig. Es sagt ja laut Hilfedatei uas das es ein stück code einer dateiausführt.
      Dafür kannst du dir auch wie alle ein Script machen und das dann auf rufen.
      Nur mal so als Beispiel. Selbst die ekleinsten dinge verpacke ich in scripts um sie später von jedem Objekte aufrufbar machen kann.

      So auch mit der Suche zum nächsten regel. Mache ein script das mit informationen (argument0-10) gespickt wird. Und am ende deine gewünschtes ergebniss ausgibt.
      Das ist auch übersichtilicher da nicht jedes Obejkt den selben Code hat und eine spätere änderung so für alle zutrifft.

      Zum grid...nimm einfach die Regdemo vom Gamemaker. Im Motion Beispielt ist ein Grid besipeil. Das hab ich auch genommen um eine Baiss auf zubauen.
      Meine Signatur hat kein Visum für das GM Forum erhalten.
    • Danke für die Ausführung...ich arbeite auch schon mit scripts um das System so flexibel wie möglich zu gestalten. Nur nochmal zur Klarstellung:

      Ein Game Maker Projekt welches mit vielen Objekten arbeitet, bei dem aber nicht viele Instanzen im Raum unterwegs sind kann performance mäßig mehr reinhauen, als ein Projekt mit wenigen Objekten aber mehr Instanzen, die gleichzeitig aktiv sind? Sprich: Die Menge an Objekten scheint einen überproportionalen Einfluss auf die Performance zu haben?

      Gruß, Benny
    • Benutzer online 1

      1 Besucher