CPU schonen

  • GM 8

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

  • hey leute, ich frage mich was es für strategien gibt um den CPU mit deinem GM game zu belasten. Denn mein spiel ruckelt am anfang etwas auf nem android handy.

    LG

    Edit: mir ist bekannt das particle sehr gut sein sollen zum schonen des CPUs.

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

  • Der Speicherbedarf auf der Festplatte/Speicherkarte hat nur indirekt mit der Leistung zu tun.

    du kannst sehr wohl einen eigenen Ladebildschirm erstellen. Dazu musst du den Teil deines Spiels vom anderen abtrennen, zum Beispiel mit einer If oder while schleife.
    ein Ansatz:

    GML-Quellcode

    1. while(geladene_resourcen <= zaehler){
    2. lade_resource();
    3. zaehler++;
    4. }else{
    5. //changeroom, playgame oder ähnliches
    6. }


    Kurz & knapp: Er zählt durch bis er alle Resourcen geladen hat und springt nachdem alle geladen wurden auf das Spiel um
  • Das kommt immer auf deinen Programmierstil und die Projekt-Art drauf an. Stell dir mal folgende Frage:
    • Müssen diese Funktion wirklich jeden Step aufgerufen werden?
      -> Einige Funktionen müssen nicht immer ausgeführt werden, sondern nur in bestimmten Fällen, für die der GameMaker kein vordefiniertes Event hat. Verwende Falgs um anzugeben, diese Funktion aufgerufen werden soll ( if (flag_calc) do_big_calc() ), oder ein UserDefine-Event.
    • Brauche ich wirklich alle Objekte im Raum?
      -> Statt viele einzelne Block-Objekte in ein Jump&Run für den Boden zu benutzen, nimm lieber nur ein Objekt und zieh es lang.
    • Spielen Objekte, die nicht im Sichtfeld sind eine Rolle?
      -> Deaktiviere unwichtige Instanzen, die nicht im View sind, wie Gegner oder Plattformen. (siehe: instance_deactivate_region)
    • Habe ich diese Berechnung nicht schon anderswo genutzt?
      -> Komplexe Berechnungen (z.B. Winkelfunktionen, Wurzelziehen, etc.) solltest du zwischenspeichern, falls du sie später erneut benutzt. Gibt es beispielsweise einen immer-wiederkehrenden Winkel, speicher dir global.angle_cos = cos(angle / 180 * PI); global.angle_sin(angle / 180 * PI);
    • Will ich mit with() nur eine Instanz ansprechen?
      -> with(obj) {...} spricht immer alle Instanzen eines Objektes an. Willst du jedoch nur eine Instanz kontrollieren, verwende die exakte ID oder den Instanzen-namen.
    • Brauche ich für jedes Sprite wirklich eine genau Kollision?
      -> Ist das Sprite von Natur aus eckig, oder ist eine genaue Kollisionsabfrage nicht notwendig, deaktiviere 'precise collision' für dieses Sprite.
    • Muss eine Schleife noch bis zum Ende durchlaufen?
      -> Gerade wenn man ein Stapel durchsucht, lässt man eine For, oder auch While-Schleife alle Elemente durchlaufen. Verwende ein break; nachdem du gefunden hast, was du suchst um die Schleife abzubrechen.
    • Verwende ich Partikel?
      -> Setze die TimeToLife niedriger.
      -> Übertrieb nicht. Oft ist weniger mehr.
    • Verwende ich das Array als Liste, Stapel, Warteschlange?
      -> Die Daten-Strukturen im GameMaker sind Arrays immer vorzuziehen, wenn sie einen dieser Funktionen entsprechen! (Danke DragonGamer :D)
      -> Willst du die Werte in der selben Reihenfolge abarbeiten, wie ich sie sammele -> benutze stattdessen eine Warteschlange: ds_queue_create()
      -> Willst du nur immer den neusten Wert deines Arrays haben -> benutze stattdessen einen Stapel: ds_stack_create()
      -> Willst du dynamisch Werte mittendrin einfügen und sie auch wieder löschen -> benutze stattdessen eine Liste: ds_list_create()
      -> Möchtest du Werte mit einen Namen (Schlüssel) assoziieren, z.B. -> benutze stattdessen Maps: ds_map_create()
    • Muss ich das jedes mal neu Zeichnen?
      -> Bei Objekten, die aus sehr vielen Formen bestehen und noch dazu kompliziert angeordnet sind, empfiehlt es sich diese auf ein Surface zu zeichnen. Zeichne das Surface nur dann neu, wenn es wirklich geändert werden muss. Verwende dazu wieder Flags. (Achtung! Bei einem Auflösungswechsel oder der Rotaion des Handy-Displays werden alle Surfaces gelöscht!)

    Edit: Wow, als ich angefangen habe zu schreiben gab es noch keine Beiträge!
    „Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.“
    Albert Einstein

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

  • Das habe ich nur geschrieben, weil ich dachte es wäre eine allgemeine Frage, dennoch empfiehlt es sich daran zu orientieren.Ein Ladebildschirm bringt nur was wenn du externe Ressourcen laden willst. Dein Spiel ist schon fertig geladen wenn der GameMaker es startet. Bei Android ist es mir auch schon aufgefallen, dass die Spiele zu beginn ruckeln. Und das auch bei Apps aus den Store. Meist bei Spielen, die wie GM-Spiele einen hohen Speicherdurst haben. Ich schätze Android versucht beim Starten noch schnell ungenutzte Hintergrundspeicher Freizugeben, bzw. die verantwortlichen Apps in den Ruhezustand zu setzen. Da kannst du eigentlich nichts gegen tun, außer unnötige Routinen zu vermeiden. Nach einer Weile laufen die Spiele wieder normal (zumindest bei mir). Bau ein Hauptmenü ein, dann stören die Anfangs-Ruckler wenigstens nicht im Spiel verlauf :D

    Ich habe auch nur einmal 1,4Ghz, also kein S3 oder Nexus. Dazu kommt noch eine unfertige JB-Rom etc.
    „Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.“
    Albert Einstein
  • dave schrieb:

    Das habe ich nur geschrieben, weil ich dachte es wäre eine allgemeine Frage, dennoch empfiehlt es sich daran zu orientieren.Ein Ladebildschirm bringt nur was wenn du externe Ressourcen laden willst. Dein Spiel ist schon fertig geladen wenn der GameMaker es startet. Bei Android ist es mir auch schon aufgefallen, dass die Spiele zu beginn ruckeln. Und das auch bei Apps aus den Store. Meist bei Spielen, die wie GM-Spiele einen hohen Speicherdurst haben. Ich schätze Android versucht beim Starten noch schnell ungenutzte Hintergrundspeicher Freizugeben, bzw. die verantwortlichen Apps in den Ruhezustand zu setzen. Da kannst du eigentlich nichts gegen tun, außer unnötige Routinen zu vermeiden. Nach einer Weile laufen die Spiele wieder normal (zumindest bei mir). Bau ein Hauptmenü ein, dann stören die Anfangs-Ruckler wenigstens nicht im Spiel verlauf :D

    Ich habe auch nur einmal 1,4Ghz, also kein S3 oder Nexus. Dazu kommt noch eine unfertige JB-Rom etc.
    genau die selbe arte von ruckler hab ich auch, naja wenn ich nichts dagegen machen kann....

    Aber danke für eure hilfe
  • Der Speicherverbrauch hat heutzutage eigentlich kaum etwas mit der Performance zutun, außer es ist zu wenig Speicher zur Verfügung, dann muss nämlich das ganze auf die Festplatte geschrieben werden und das ist langsam (oder das Speichermanagment vom Betriebssystem ist nicht das beste).

    Du kannst die FPS anzeigen lassen und dann schauen wie viel das nun sind, der Wert sollte eigentlich beim Room Speed sein (also 30 bzw. 60 Frames per second). Desweitern könntest detailreiche Dinge deaktivieren und schauen wie sich die FPS verbessert. Für deine Handy-Version solltest du generell die Details ein wenig runterschrauben, ein Menü dafür wäre noch besser.

    GML Code lässt sich wie dave bereits gut aufgezählt hat, auch optimieren und wenn man Code-Lesbarkeit lieber im Auge halten soll.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • -> Die Daten-Strukturen im GameMaker sind Arrays immer vorzuziehen!
    Also das würde ich so nicht empfehlen..
    Datenstrukturen sind ausschlieslich dann sinnvoll wenn man eine der Funktionalitäten die du erwähnt hast, auch braucht. Dies ist allerdings nicht sooo häufig der Fall musste ich zumindest mal feststellen.
    Wenn man nur auf die Daten zugreifen oder sie verändern will, dann sind Arrays sehr oft sinnvoller da ein Zugriff auf das Array um ein vielfaches schneller ist als ein Funktionsaufruf wie ds_list_get/set, etc..
    Nicht sicher ob sich das im GM Studio geändert hat, aber ich vermute mal nicht - in anderen Programmiersprachen ist es meist das selbe.
    EDIT: Okey, glaube du hast das sowieso anders gemeint...


    @Iboshido
    Wenn du solche Ruckler hast, dann solltest du diese mal wie bugs betrachten und entsprechend "debuggen". Nimm bestimmte Spielelemente, btw. Codes in steps-events heraus und schau ob diese die Geschwindigkeit nenenswert beeinflussen! Um nicht nur auf Ruckler achten zu müssen, solltest du zu Testzwecken den Roomspeed aufs Maximum setzen und schauen welche Spiel-Funktionalitäten besonders viel FPS nehmen.


    EDIT: Danke dir henrik1235, damit ist mein zweiter Absatz überflüssig... :D

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

    wie gesagt ruckelt es zu beginn nur etwas. Könnte es villt damit zusammenhängen das ich eine zu große auflösung benutze und allgemein zu große sprites? Meine auflösung ist 561*850. Wollte nämlich nicht nur handys sondern auch tablets erreichen xD
    Mit der Auflösung hängt es in keiner Art und Weise zusammen, da GM:S automatisch die Auflösung an die mobilen Geräte skaliert. Die Anfangsruckler sind bei Androidgeräten absolut normal. Dies sollte allerdings eine Sache von wenigen Sekunden sein, welche mit dem Hauptmenu oder einem schönen Anfangsscreen übertönt werden kann, sollte wohl bei einem Spiel kein großartiges Problem sein.
  • dave schrieb:

    Das kommt immer auf deinen Programmierstil und die Projekt-Art drauf an. Stell dir mal folgende Frage: [...]
    Das sind echt super Tipps, dankeschön! An das mit der präzisen Kollision hab ich gar nicht gedacht. :)

    Zwei Fragen hätte ich zum Thema CPU/GPU Schonen:

    1. Gibt es einen Perfomanceunterschied zwischen dem Anzeigen des Sprites ohne Draw-Event und dem Anzeigen mit draw_sprite? Also, wenn ich einer Instanz über das GM-GUI ein Sprite gebe oder übers Create oder Step Event. Ist es perfomanter, dieses mit Draw zu zeichnen oder ohne Draw anzuzeigen? Und wie ist das Verhältnis zum visible-Attribut, mit dem man Sprites unsichtbar schaltet? Bringt das was?

    2. Lohnt es sich, zu machen, dass alle Instanzen im Raum nur dann Sprites zeichnen, wenn sie im View des Spielers sind oder bringt das nichts, weil sie ja ansonsten trotzdem berechnet werden und die Sprites ohnehin im Speicher sind?

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

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