GMS Spiele lahmen nach mehreren Malen Spielens

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

  • GMS Spiele lahmen nach mehreren Malen Spielens

    Hallo, zwei meiner Projekte fangen an zu lahmen, dass heißt die frames brechen extrem ein, wenn ich sie öfters hintereinander anspiele. Bei anderen Spielen ist dass nicht so, nur bei diesen Zweien. DIese haben zwei Gemeinsamkeiten: Beide verwenden die box2d Physic Engine und Beide verwenden mehrere Surfaces. Kann es an den Surfaces liegen? Ich benutze allerdings die Funktion surface_free wenn das Spiel endet. Doch wenn ich testspiele minimiere ich das Projekt immer und klicke dann auf den roten "Stop webserver" Button. Ich weiß nicht, ob dann das Game End Event dennoch ausgeführt wird oder ob die Funktion surface_free überhaupt am Ende benutzt werden muss, damit der Speicher befreit wird.
    Wenn es nicht an den SUrface liegt, könnte es doch an der Physic ENgine liegen. Doch warum nur? Ansonsten habe ich ein wenig Sorge, dass es was mit dem letzten Update des GMS zutun hat.

    Kennt jemand das Problem? Woran könnte es liegen und wie beheb ich das? Wie gesagt, nur nach mehrmaligem Spielen gehen die FPS runter.
    Schon mal Danke für Antworten.
  • Also GMS hat eine Auslastung von ca. 15000 K, ein Dreisigstel von Firefox. Das Spiel hat ca. 32000 K allerdings eine CPU Auslastung von im Schnitt 20 (?!).
    Was mich sehr wundert ist, dass ich die ganze Zeit eine CPU Auslastung um die 90% habe. Mit dem Spiel knappe 100%. Da ist doch irgendwas nicht in Ordnung oder?
    Kenn mich mit Hardware aber nicht so aus.

    edit: Nein ich hatte das Spiel noch laufen im Hintergrund. ABer dennoch schwankt die CPU Auslastung bei 60% obwohl ich nur Firefox offen habe. Irgendwie kam mir der Lapi in letzter Zeit eh langsamer vor, irgendwas ist da nicht in Ordnung.

    @ Nico001: Ich lösche die Surfaces mit surface_free. Sollte also nicht daran liegen.

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

  • Also ich habe herausgefunden, dass es definitiv an den Surfaces liegt. Wenn ich die Surfaces weglasse läuft alles tuttifrutti. Wenn ich die SUrfaces drin lasse und das erste mal nach Systemstart das Spiel starte läuft es mit etwas weniger FPS aber immernoch schnell genug. Ab den zweiten Mal dann brechen die fps ein! Doch ich habe surface_free im Game End Event stehen. Wie kann das sein? Kann ich jetzt keine SUrfaces mehr benutzen oder was?! Gerade mit denen will ich so cooe Sachen machen und das geht nur mit SUrfaces.
  • Wenn man mehrere Rooms hat und für jeden Room die Surfaces neu erstellt werden könnte es sein,
    dass die Surfaces zwar gleich heißen, aber im Speicher unterschiedliche Plätze belegen.

    Evtl. ließe sich das beheben indem du surface_free() auch im Room-End-Event aufrufst in deinem Controllerobjekt.
    Ich mache das zumindest so. Bei mir scheint es zu funktionieren.

    edit/ Sollte dem aber selbst mal einen Härtetest unterziehen.
  • @ RLP: Danke, aber mein Spiel hat bis jetzt nur einen Raum. Es gibt nur drei Surfaces, jeweils mit einer Größe von 320x240 Pixel.

    Also ich versteh jetzt gar nichts mehr! Ich lasse jetzt auf die Surfaces nicht mehr Step sondern jetzt im Draw Event zeichnen. Dann hatte ich wieder schöne 30 FPS. Doch dann auf einmal nur noch 15. Also dass Problem zeigt sich jetzt auf einmal so, dass es 3 - 8 mal (oder so) flüssig läuft und dann auf einmal wieder nicht. Meistens gehts manchmal aber auch nicht! HÄ!!!!

    Wie flüssig läuft es bei euch?

    workupload.com/file/PMpp0oMq

    Lasst es länger laufen wenn ihr testet und startet das Spiel ein paar mal. Wäre sehr nett wenn jemand mal testet, danke.
  • Habe es nun mal 15 min getestet. Das Spiel hat von Anfang nur 10 FPS bei mir angezeigt und lief auch 15 Min mit 10 FPS.
    Simple Frage: Dein Roomspeed wie hoch ist der? :)

    Offen im Hintergrund war "nur" Firefox und Virenscanner. Mein Ram ist also nicht gestiegen durch dein Spiel. Ist fast immer 30% voll durch Hintergrundprogramme.

    Anbei kleines Bild mit Auslastungen von CPU / RAM in % und Grafikkarte (Aktivität etc).
    Bilder
    • gm2.png

      271,03 kB, 892×359, 282 mal angesehen
  • Morpheus schrieb:

    @ RLP: Danke, aber mein Spiel hat bis jetzt nur einen Raum. Es gibt nur drei Surfaces, jeweils mit einer Größe von 320x240 Pixel.

    Also daran kann es nicht liegen ich habe bei einem Spiel von mir 8 Surfaces mit je nach ausgewählter Spielauflösung 1920*1020 Pixeln.
    Zudem noch etliche kleine für Menüs ect. und da läuft trotzdem nichts langsam, auch auf schwächerem PC getestet.


    Atomicmaster schrieb:

    Mein Ram ist also nicht gestiegen durch dein Spiel.

    Na das hört sich doch schon mal gut an, können wir den Punkt also abhaken.
  • No Problemo. Mir gab nur die Grafikarten Auslastung etwas zu denken (Radeon R9 270x). Die war zw 30 - 50 % was mir sehr viel vorkommt für ein Spiel dieser "Grafik" Fraktion.
    Denke du musst iwo bei den Surfaces suchen. Irgendwo ist sicher dort der Fehler.
  • Jemand kann ja mal meinen Code angucken:

    im draw event:

    GML-Quellcode

    1. surface_set_target(surf);
    2. draw_clear(c_black);
    3. draw_set_blend_mode(bm_subtract);
    4. draw_set_color(c_white);
    5. draw_circle(Player.x-view_xview,Player.y-view_yview, 64,false);
    6. draw_set_blend_mode(bm_normal);
    7. surface_reset_target();
    8. ///////////////////////////////////////////////////////////////
    9. surface_set_target(surf2);
    10. draw_clear(c_black);
    11. // Es git nicht sonderlich viele Instanzen, da ich alle außerhalb des views lösche (vielleicht max. 100)
    12. with
    13. (par_static)
    14. draw_sprite_ext(sprite_index,image_index,x-view_xview,y-view_yview,image_xscale,image_yscale,image_angle,image_blend,image_alpha);
    15. with
    16. (par_dynamic)
    17. draw_sprite_ext(sprite_index,image_index,x-view_xview,y-view_yview,image_xscale,image_yscale,image_angle,image_blend,image_alpha);
    18. with
    19. (par_NO_PHY)
    20. draw_sprite_ext(sprite_index,image_index,x-view_xview,y-view_yview,image_xscale,image_yscale,image_angle,image_blend,image_alpha);
    21. draw_surface(surf,0,0);
    22. if sprite_exists(sprite) sprite_delete(sprite);
    23. sprite = sprite_create_from_surface(surf2,0,0,320,240,true,false,0,0);
    24. surface_reset_target();
    25. ///////////////////////////////////////////////////////////////
    26. surface_set_target(surf);
    27. draw_clear(c_black);
    28. draw_set_blend_mode(bm_subtract);
    29. draw_set_color(c_white);
    30. draw_circle(Player.x-view_xview,Player.y-view_yview, 96,false);
    31. draw_set_blend_mode(bm_normal);
    32. surface_reset_target();
    33. ///////////////////////////////////////////////////////////////
    34. surface_set_target(surf3);
    35. draw_clear_alpha(c_black,1);
    36. // Es git nicht sonderlich viele Instanzen, da ich alle außerhalb des views lösche (vielleicht max. 100)
    37. with (par_static) event_perform(ev_draw, 0);
    38. with (par_dynamic) event_perform(ev_draw, 0);
    39. with (par_NO_PHY) event_perform(ev_draw, 0);
    40. with (par_see) event_perform(ev_draw, 0);
    41. draw_surface(surf, 0,0);
    42. draw_sprite(sprite,0,0,0);
    43. //könnte das die GPU zu sehr belasten?
    44. if sprite_exists(sprite2) sprite_delete(sprite2);
    45. sprite2 = sprite_create_from_surface(surf3,0,0,view_wview,view_hview,0,0,0,0);
    46. draw_clear(make_color_hsv(farbe1,240,180));
    47. if sprite_exists(grayscale) sprite_delete(grayscale);
    48. grayscale = sprite_create_from_surface(surf3,0,0,view_wview,view_hview,0,0,0,0);
    49. sprite_set_alpha_from_sprite(grayscale,sprite2);
    50. draw_clear(make_color_hsv(farbe2,240,40));
    51. draw_sprite(grayscale,0,0,0);
    52. surface_reset_target();
    53. //////////////////////////////////////////////
    54. //////////////////////////////////////////////
    55. draw_surface(surf3, view_xview,view_yview);
    Alles anzeigen

  • Morpheus schrieb:

    GML-Quellcode

    1. //könnte das die GPU zu sehr belasten?
    2. if sprite_exists(sprite2) sprite_delete(sprite2);
    3. sprite2 = sprite_create_from_surface(surf3,0,0,view_wview,view_hview,0,0,0,0);
    4. draw_clear(make_color_hsv(farbe1,240,180));
    5. if sprite_exists(grayscale) sprite_delete(grayscale);
    6. grayscale = sprite_create_from_surface(surf3,0,0,view_wview,view_hview,0,0,0,0);
    7. sprite_set_alpha_from_sprite(grayscale,sprite2);
    8. draw_clear(make_color_hsv(farbe2,240,40));
    9. draw_sprite(grayscale,0,0,0);

    Au ja, ich denke das könnte es sein.
    Vor einiger Zeit hatte ich in meinem Projekt noch Modding-Support, und da sah der Code ähnlich aus.
    Ich konnte da auch einen Anstieg des RAMs verzeichnen, selbst mit einer Memory Cleaning DLL war das Ergebnis ungenügend.
    Diese hatte nämlich zwar den überflüssigen Speicher vom Spiel weggenommen bei "Prozesse",
    aber dafür wurde der verwendete Speicher bei "Leistung" im Task-Manager größer.
    Ich glaube es hat dann so halbwegs funktioniert als ich diese DLL-Funktion einmal pro Sekunde oder so ähnlich aufgerufen habe.

    Hier das Ergebnis meiner Suche, wenn ich den Namen der DLL eingebe.

    Fazit: Der GM schafft es offenbar immer noch nicht vernünftig mit externen Ressourcen umzugehen.
  • Pacmangamer schrieb:

    Also ich hab konstante 70-100 fps auch über mehr als 5 minuten hinweg.


    Chinafreak schrieb:

    Ich kann bestätigen. Vorher hatte ich 40FPS, nach kaum 5 Minute kriege ich schon 30FPS. (Firefox, GameMaker, ThunderBird und Steam waren nebenbei offen).
    Habs mal ohne Nebenprogramm benutzt: 55FPS, später wird es dann auf 45FPS runtergedrosselt.



    Naja bei mir startet das Spiel mit 10 FPS (Real FPS auch) und bleibt bei 10 FPS. Und Ich spiele Witcher 3 auf Hoch / 1920x1080 flüssig etc...


    Komisch das bei verschiedenen Systemen solche Unterschiede sind?
  • Irgendwas ist das mit sicherheit nicht in Ordnung.

    Bei mir lädt es mit 150fps, fängt sich dann bei 80fps und man kann richtig zusehen wie es runtersackt bis auf unter 30fps.

    Edit: Wenn ich mich nicht vom Start wegbewege bleibt es bei 60fps hängen.
    Siet so aus als schaffst du durch die Umgebung oder der gleichen zusätzliche Arbeit?
    Bilder
    • 152.jpg

      74,17 kB, 1.920×1.080, 258 mal angesehen
    • 080.jpg

      73,76 kB, 1.920×1.080, 314 mal angesehen
    • 072.jpg

      60,46 kB, 1.920×1.080, 277 mal angesehen
    • 029.jpg

      67,58 kB, 1.920×1.080, 260 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Balls of Steel ()

  • Stark von euch dass ohr alle testet und eure Ergebnisse präsentiert. Ich hab inzwischen eigentlich die Lust an dem kleinen Spiel verloren, da mich das so ankotzt, verzeiht die Wortwahl.

    Dass mit der Umgebung kann ich mir eigentlich nur so erklären, dass an manchen Stellen mehr Blöcke im View sind, die auf die Surfaces gezeichnet werden müssen. Dazu muss ich sagen, dass ich dass Level, aus Faulheit, aus vielen großen Blöcken gebaut hab und das Spiel dann daraus kleine macht und an bestimmten Stellen Schrägen macht. Darum sind die alle nur 16*16 Pixel groß. Der Fehler könnte auch in meinem System stecken, dass die Blöcke aufbaut (im View einmal) und wieder löscht (wenn aßerhalb des Views). Ich hab keine Ahnung. Und momentan auch keine Lust mehr mich damit rumzuärgern. Ich hab nur Angst das es allgemein Kompatibilitätsprobleme mit GMS seit dem letzten Update gibt.
  • Verwende sprite_create_from_surface nur wenn du wirklich Sprites benötigst.
    Meistens lässt sich alles auch direkt mit dem surface machen.

    In meiner Erfahrung verursacht der wiederholte Aufruf(auch mit sprite_delete) starke FPS Einbrüche.(Wobei ich meist mit größere Surfaces arbeite)
    Meistens fallen die FPS bereits unter 30, wenn die Funktion nur 1 oder 2 mal im step/draw/... Event verwendet wird.