[gm:html5/studio] Performance

  • GM 8

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

  • [gm:html5/studio] Performance

    Hey, ich hab da mal ne Frage zur performance!
    In meinem aktuellen Game steigt die Leistung von Firefox auf mehr als das doppelte an bis irgendwann das Game nur noch am harken ist.

    Ich habe einfach mal ein paar KIs (~80) die ausserhalb des Raums spawnen und jede Menge abfragen im Step Event haben, bringt es mir etwas wenn ich vor den ganzen Abfragen ersteinmal eine Abfrage machen würde ob sich die Instance überhaupt im Raum befindet? Genau so werden bei anderen Objekten im Step-Event die ganze Zeit Werte berechnet die eigentlich nur zwischendurch mal berechnet werden müssten, bringen mir vor solchen Dingen If Abfragen etwas oder ist die dadurch gesparrte Leistung zu gering?

    Grüße ;)

    EDIT: Und nebenbei noch einige Kollisions-Abfragen...
    @7rust-dev

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Lucke () aus folgendem Grund: Überschrift ;)

  • Kurze Antwort: Ja!
    Man sollte immer auf effizientes coding achten und alles was keine Auswirkungen auf den Spieler hat, immer ausschalten. Dies gilt übrigens unabhängig davon ob du mit dem GM arbeitest, effizienterem C++ oder gar für Supercomputer programmierst.

    p.s. um Dinge außerhalb des Views abzuschalten, kannst du das outside-view event verwenden. Da dies GM-intern abgefragt wird, ist es sehr, sehr performant (und schneller als wenn du "manuell" die x und y Koordinaten abfragst).

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Am besten machst du im outside view event eine Variable "draw" die auf false gesetzt wird und im inside view event auf true gesetzt wird.
    Dann musst du in den Events nur noch abfragen ob die variable true ist und dann zeichnen bzw. berechnen.

    Das draw event in den Step zu packen geht nicht, da draw Funktionen nur im draw event funktionieren! Du kannst es aber umgekehrt machen und alle Berechnungen in den draw verschieben. Sofern dein Spiel nicht zu kompliziert ist (d.h. du Surfaces in den step events verwendest oder von der screen_redraw Funktion gebrauch machst) sollte dies problemlos funktionieren. Wirklich was maßgeblich einsparen tut es aber nicht (sofern nicht die selben Dinge in beiden events berechnet werden, was aber nicht der fall sein sollte)!

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Sofern dein Spiel nicht zu kompliziert ist (d.h. du Surfaces in den
    step events verwendest oder von der screen_redraw Funktion gebrauch
    machst)
    Nein nein, das sind recht einfache Abfragen und so ein Zeugs, ich will halt nur versuchen das Ganze so Sparsam wie möglich zu machen! Ein Tabelle wäre recht hilfreich in der man mehr über den Verbrauch der Funktionen/Events erfährt! Zieht das Draw-Event viel Leistung, weiß das zufällig jemand? ;)
    @7rust-dev
  • Ehm.. ein Event an sich zieht eigentlich keine "Leistung" nur der Code darin...

    Versuch einfach nur einen ordentlichen, performanten Stil zu benutzen mit dem Grundsatz: Desto weniger Code desto besser. Das ist eigetnlich alles was man beachten muss.
    Dann aber Funktionen wie execute_string() und string() möglichst vermeiden.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Oh, das ist nicht gut!
    String() ist im Game Maker verhältnismäßig extrem langsam.
    Wenn ich mich nicht irre, braucht es etwa so lang wie dutzende Zuweisungen...
    Meistens ist es aber absolut vermeidbar. Auch in draw events... aus welchem grund verwendest du es da?

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

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

  • Lucke schrieb:

    Für die konvertierung von irgendwelchen Zahlen zum String!

    Ah. Werden deine zahlen denn jeden Step aktualisiert?
    Wenn nicht, solltest du den String in eine variable speichern die nur dann erneuert wird wenn dies tatsächlich nötig ist.
    Des Weiteren kannst du auch draw_string(x,y,1999) schreiben. Nur sraw_string(x,y,"abc"+1999) geht nicht.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Ah oke, dann werde ich string() dann erstmal meiden und für die Zahl einen String anlegen so das sie nicht jedes mal umgewandelt werden muss!

    Ich hab ausserdem noch 4 Kollisions-Events laufen...fressen die wohl viel perfomance? Ich würde es ja gerne im Step Event via Codes machen, dann könnte ich vorher nochmal eine Abfrage starten ob die KI's überhaupt im Raum sind, aber ich komme irgendwie mit den Kollisions-Funktionen nicht so ganz zu rechts :s

    EDIT: Hab die Kollision jetzt doch im Step via. GML gemacht, wäre es jetzt klug abzufragen ob sich das Objekt mit dem die Kollision stattfinden kann näher als zb. 30 befindet....so müsste ja nicht permanent gecheckt werden ob eine Kollision vorliegt..
    @7rust-dev

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

  • Bin mir da nicht so sicher ob das was bringt. Der Game Maker macht soetwas schon von alleine indem er die "bounding-boxes" benuzt. Diese sind sozusagen quadratische Boxen um jede Instanz herum. Die Kollision (oder eher das Überlappen) zwischen denen zu berechnen ist schneller als die mathematischen Berechnungen die bei einem point_distance aufruf durchgeführt werden.

    Nur wenn du aus irgendeinem Grund nur alle paar Sekunden überprüfen willst ob zwei Instanzen gerade kolidieren, solltest du die _meeting() Funktionen verwenden sowie die anderen aus diesem Kapitel in der Hilfe.

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

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

  • Lucke schrieb:

    Alles klar ;) wunderbar, ich danke dir für die super Hilfe! Wenn nochmal irgendwas ist dann poste ich einfach hinterher ;)

    Grüße, Lucke!

    Kein Problem =)
    Poste hier aber nur wenn es wirklich was mit Performance zutun hat. Multifrage-threads sind eigentlich nicht erlaubt.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Oke, back! ;)

    Mein aktuellen Projekt verwundert mich ein wenig, denn es wird schlechter und schlechter von Zeit zu Zeit, heißt es ruckelt immer stärker, sagen wir mal es sind so ca. ~80 Instancen im Spiel...alle werden wieder ausgeschaltet und sind destroyed trotzdem ruckelt das Spiel weiter...obwohl wieder in der selben Phase wie beim start ist :S
    @7rust-dev
  • Allgemein für den GM gilt: für relativ flüssige größere Spiele
    muss ein optimales System aufgebaut werden das möglichst sparsam und
    effizient arbeitet
    MMh, oke habe ich mich nun drumm gekümmert und die Objekte bzw. KI's performance freundlicher gemacht.


    Was noch sehr nett wäre, wenn ihr diese halb englisch halb deutsch Sprache weglassen könntet. ("destroyed", "in jedem step", "gedrawd" etc)
    Alles klar, ich finde du gehst da mit
    ein Spiel für Smartphones dahin dödeln
    echt mit nem guten Beispiel vorran. So viel zum Thema!

    Der GM ist nunmal Englisch...wieso sollten wir jetzt alle Funktionen ins Deutsche übersetzen, das würde nur unnötige Komplikationen geben. Ausserdem weiß doch echt jeder was damit gemeint ist..

    Meine eigentliche Frage:

    Was wäre performance freundlicher?

    1)

    GML-Quellcode

    1. if a=1 and b1=1 {...}


    2)

    GML-Quellcode

    1. if a=1 then {
    2. if b=1 then {...}
    3. }


    Das sind jetzt nur einfache Funktionen wo Werte verglichen werden, bei mir gehts dabei mehr um instancen und Kollisionen die Abgefragt werden, deswegen würde mich das mal interessieren.

    Greez. Lucke
    @7rust-dev
  • Lucke schrieb:


    Der GM ist nunmal Englisch...wieso sollten wir jetzt alle Funktionen ins Deutsche übersetzen, das würde nur unnötige Komplikationen geben. Ausserdem weiß doch echt jeder was damit gemeint ist..

    Richtig.

    Lucke schrieb:



    Was wäre performance freundlicher?

    1)

    GML-Quellcode

    1. if a=1 and b1=1 {...}


    2)

    GML-Quellcode

    1. if a=1 then {
    2. if b=1 then {...}
    3. }


    Das sind jetzt nur einfache Funktionen wo Werte verglichen werden, bei mir gehts dabei mehr um instancen und Kollisionen die Abgefragt werden, deswegen würde mich das mal interessieren.


    Hehe, genau das hat mich auch interessiert und dabei festgestellt dass der Game Maker (zumindest GM 8.1) im Gegensatz zu anderen Sprachen wie C# beim AND-Statement immer beide Seiten auswertet, egal was der erste Teil ergeben hat.
    Von daher ist eine Verkettung von if-Abfragen performancetechnisch besser als das AND statement zu verwenden, sofern es sich vermeiden lässt. Der Unterschied ist aber auch nicht so enorm...

    Du musst aber außerdem beachten dass

    GML-Quellcode

    1. if a = b and c = d
    2. {
    3. // code
    4. }
    5. else
    6. {
    7. //code
    8. }

    Nicht das selbe ist wie

    GML-Quellcode

    1. if a = b
    2. if c = d
    3. {
    4. // code
    5. }
    6. else
    7. {
    8. //code
    9. }

    Da das "oder" (ja, ich machs dir recht, Famous :P ) sich dann nur auf die zweite If-Abfrage bezieht...


    Mfg, DragonGamer

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Wenn es dir nur um so kleine Dinge geht, kannst du mich auch direkt anschreiben.

    Allerdings... diese Frage zum Beispiel hättest du dir auch selbst beantworten können indem du selber die Zeit misst die ein bestimmtes Skript zum ausführen braucht. Dies kannst du entweder mit den date/time-Funktionen machen, oder du erstellst einen Raum mit einem Speed von 9999 steps, stellst ein Objekt rein dessen Step event das Skript beinhaltet (das mit "repeat" z.B. 1000 mal ausgeführt wird). Dann kannst du mit dem debug mode des Game Makers sehen wieviele Steps pro Sekunde tasächlich geschafft werden.
    Diese Methode mag sehr ungenau klingen/sein, da der GM nun mal sehr viel mehr nebenbei in jedem Step ausführt. Aber meiner Meinung nach reicht es absolut aus um die Performance von zwei verschiedenen Dingen zu vergleichen.

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