Memory läuft ständig hoch

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

  • Memory läuft ständig hoch

    Mir ist beim debuggen aufgefallen das sich die Memory ständig erweitert, sollte ja im Idealfall nicht so sein :huh:
    Wenn ich folgenden Code deaktiviere ist das nicht der Fall.
    Animation Update:
    Spoiler anzeigen

    GML-Quellcode

    1. ///Zielen Bones
    2. // Bones AIM
    3. var roomangle_p1 = point_direction(x, y-120, mouse_x, mouse_y);
    4. // Nach rechts schauen /look right
    5. if (mouse_x < obj_player1.x-150)
    6. {
    7. obj_player1.image_xscale = -.25;
    8. }else if (mouse_x > obj_player1.x+150)
    9. {
    10. obj_player1.image_xscale = .25;
    11. }
    12. if image_xscale = .25
    13. {
    14. //Rechts Oben / Right Up
    15. if roomangle_p1 <= 130
    16. {
    17. var map = ds_map_create();
    18. skeleton_bone_state_get("Ruecken_O", map);
    19. var angle1 = roomangle_p1-((0+roomangle_p1)*.85) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    20. ds_map_replace(map, "angle", angle1);
    21. skeleton_bone_state_set("Ruecken_O", map);
    22. ds_map_destroy(map);
    23. var map = ds_map_create();
    24. skeleton_bone_state_get("Ruecken_M", map);
    25. var angle2 = roomangle_p1-((0+roomangle_p1)*.85) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    26. ds_map_replace(map, "angle", angle2);
    27. skeleton_bone_state_set("Ruecken_M", map);
    28. ds_map_destroy(map);
    29. var map = ds_map_create();
    30. skeleton_bone_state_get("Ruecken_U", map);
    31. var angle3 = roomangle_p1-((0+roomangle_p1)*.85) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    32. ds_map_replace(map, "angle", angle3-90);
    33. skeleton_bone_state_set("Ruecken_U", map);
    34. ds_map_destroy(map);
    35. var map = ds_map_create();
    36. skeleton_bone_state_get("Kopf", map);
    37. var angleK = roomangle_p1-((0+roomangle_p1)*.65) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    38. ds_map_replace(map, "angle", angleK);
    39. skeleton_bone_state_set("Kopf", map);
    40. ds_map_destroy(map);
    41. }
    42. //Rechts unten / right down
    43. else
    44. {
    45. var map = ds_map_create();
    46. skeleton_bone_state_get("Ruecken_O", map);
    47. var angle1 = roomangle_p1+((359.99-roomangle_p1)*.75) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    48. ds_map_replace(map, "angle", angle1);
    49. skeleton_bone_state_set("Ruecken_O", map);
    50. ds_map_destroy(map);
    51. var map = ds_map_create();
    52. skeleton_bone_state_get("Ruecken_M", map);
    53. var angle2 = roomangle_p1+((359.99-roomangle_p1)*.85) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    54. ds_map_replace(map, "angle", angle2);
    55. skeleton_bone_state_set("Ruecken_M", map);
    56. ds_map_destroy(map);
    57. var map = ds_map_create();
    58. skeleton_bone_state_get("Ruecken_U", map);
    59. var angle3 = roomangle_p1+((359.99-roomangle_p1)*.75) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    60. ds_map_replace(map, "angle", angle3-90);
    61. skeleton_bone_state_set("Ruecken_U", map);
    62. ds_map_destroy(map);
    63. var map = ds_map_create();
    64. skeleton_bone_state_get("Kopf", map);
    65. var angleK = roomangle_p1+((359.99-roomangle_p1)*.65) // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert erhöt das Verbiegen. Wert zwischen 1-0
    66. ds_map_replace(map, "angle", angleK);
    67. skeleton_bone_state_set("Kopf", map);
    68. ds_map_destroy(map);
    69. }
    70. var map = ds_map_create();
    71. skeleton_bone_state_get("Zielen", map);
    72. var angle = roomangle_p1
    73. ds_map_replace(map, "angle", angle-angle1-angle2-angle3-90);
    74. skeleton_bone_state_set("Zielen", map);
    75. ds_map_destroy(map);
    76. }
    77. // Nach links schauen / look left
    78. if image_xscale = -.25
    79. {
    80. //Links oben / left up
    81. if roomangle_p1 <= 180
    82. {
    83. var map = ds_map_create();
    84. skeleton_bone_state_get("Ruecken_O", map);
    85. var angle1 = (roomangle_p1*-1+180)*.15; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    86. ds_map_replace(map, "angle", angle1);
    87. skeleton_bone_state_set("Ruecken_O", map);
    88. ds_map_destroy(map);
    89. var map = ds_map_create();
    90. skeleton_bone_state_get("Ruecken_M", map);
    91. var angle2 = (roomangle_p1*-1+180)*.15; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    92. ds_map_replace(map, "angle", angle2);
    93. skeleton_bone_state_set("Ruecken_M", map);
    94. ds_map_destroy(map);
    95. var map = ds_map_create();
    96. skeleton_bone_state_get("Ruecken_U", map);
    97. var angle3 = (roomangle_p1*-1+180)*.15; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    98. ds_map_replace(map, "angle", angle3-90);
    99. skeleton_bone_state_set("Ruecken_U", map);
    100. ds_map_destroy(map);
    101. var map = ds_map_create();
    102. skeleton_bone_state_get("Kopf", map);
    103. var angleK = (roomangle_p1*-1+180)*.35; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    104. ds_map_replace(map, "angle", angleK);
    105. skeleton_bone_state_set("Kopf", map);
    106. ds_map_destroy(map);
    107. }
    108. // Links unten / left down
    109. else
    110. {
    111. var map = ds_map_create();
    112. skeleton_bone_state_get("Ruecken_O", map);
    113. var angle1 = (roomangle_p1*-1+180)*.25; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    114. ds_map_replace(map, "angle", angle1);
    115. skeleton_bone_state_set("Ruecken_O", map);
    116. ds_map_destroy(map);
    117. var map = ds_map_create();
    118. skeleton_bone_state_get("Ruecken_M", map);
    119. var angle2 = (roomangle_p1*-1+180)*.15; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    120. ds_map_replace(map, "angle", angle2);
    121. skeleton_bone_state_set("Ruecken_M", map);
    122. ds_map_destroy(map);
    123. var map = ds_map_create();
    124. skeleton_bone_state_get("Ruecken_U", map);
    125. var angle3 = (roomangle_p1*-1+180)*.25; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    126. ds_map_replace(map, "angle", angle3-90);
    127. skeleton_bone_state_set("Ruecken_U", map);
    128. ds_map_destroy(map);
    129. draw_text(100,450,angle3)
    130. var map = ds_map_create();
    131. skeleton_bone_state_get("Kopf", map);
    132. var angleK = (roomangle_p1*-1+180)*.35; // Wert .x legt fest wie stark der Bone sich verbiegt. Kleinerer Wert verringert das Verbiegen. Wert zwischen 1-0
    133. ds_map_replace(map, "angle", angleK);
    134. skeleton_bone_state_set("Kopf", map);
    135. ds_map_destroy(map);
    136. }
    137. var map = ds_map_create();
    138. skeleton_bone_state_get("Zielen", map);
    139. var angle = roomangle_p1*-1
    140. ds_map_replace(map, "angle", angle+90-angle1-angle2-angle3);
    141. skeleton_bone_state_set("Zielen", map);
    142. ds_map_destroy(map);
    143. }
    144. draw_text(100,300,roomangle_p1)
    Alles anzeigen


    obwohl ich ja wie in der Anleitung die ds_map immer zerstöre. Sieht jemand einen Fehler was mir der Speicher vollhaut?

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

  • Ich glaube es wäre besser, wenn du nur eine Map erstellst und am Ende diese auch wieder zerstörst.
    Die Funktion skeleton_bone_get_state sollte dir die Map nur überschreiben. Das spart Code und wahrscheinlich löst das auch dein Memory Problem :)
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Hab das mal ausprobiert und alle create maps bis auf den Anfang gelöscht. Scheint aber nicht zu funktionieren da es mir alles recht buggy verschiebt und komisch aussieht(und die Memory immer noch weiter rennt). Recht eigenartig das ganze.

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

  • Du solltest im Hinterkopf behalten, dass GML wahscheinlich keine "echte" Speicherkontrolle ermöglicht, sondern intern irgendeine Form von Garbage Collection durchgeführt wird - soll heißen, der Speicher einer Datenstruktur wird nicht sofort wieder freigegeben, wenn du die Datenstruktur zerstörst, sondern bleibt noch ne Weile liegen und wird dann automatisiert aufgeräumt. ds_*_destroy löscht dabei vermutlich nur die Referenz auf die echte Datenstruktur aus der GML-Umgebung, sodass du sie nicht mehr benutzen kannst.
    Das ist jetzt natürlich nur ne Vermutung, aber man könnte da zum Testen z.B. mal mehrere Minuten lang einfach nur Datenstrukturen erstellen, mit Quatsch füllen und wieder löschen - und dabei dann gucken, ob der Speicher tatsächlich unbegrenzt weiter wächst oder irgendwann wieder fällt.
  • Falls es wirklich ein memory leak ist, würde ich versuchen nacheinander codezeilen auszukommentieren und dann schauen ob die speicherauslastung weiter läuft.
    z.B: versuch die skeleton_bone_state_get und skeleton_bone_state_set funktionsaufrufe auszukommentieren.

    Und bezüglich optimierung würde ich wie bereits oben gesagt nur 1 mal eine map erstellen und diese wiederverwenden. Ständige allocationen und deallocationen mit ds_map_create und _destroy können sich negativ auf die performance auswirken. (du kannst mit ds_map_clear() die datenstruktur jedesmal zurücksetzen ohne diese jedesmal löschen zu müssen.)
  • @LEWA

    Hat mich schon mal ein Stück weitergebracht. Habe jetzt nur noch einmal das erstellen von der ds_map und zerstöre sie nur noch am Ende. Habe jetzt alle ds_map destroy durch clear ersetzt. Funkionert genau so und ich habe nicht mehr diese Verschiebung wie wenn ich es ganz weglasse und die Framerate ist auch höher :thumbsup: .

    Ich habe mal alles auf einen Bone reduziert. Sobald ich skeleton_bone_state_set("Bone", map); ausklammere ist die Memory auch stabil und läuft nicht weiter hoch. Nun weiss ich allerdings nicht was ich dagegen tun soll?
  • Jomnitech schrieb:

    Ich habe mal alles auf einen Bone reduziert. Sobald ich skeleton_bone_state_set("Bone", map); ausklammere ist die Memory auch stabil und läuft nicht weiter hoch. Nun weiss ich allerdings nicht was ich dagegen tun soll?

    Ich würde das Yoyogames als bug melden. (Was anderes bleibt einem nicht übrig. Man hat ja nicht zugriff auf dem Source-code vom GM um das selber fixen zu können...)

    Der Grund wieso ich überhaupt skeleton_bone_state_set und ..._get erwähnt habe, ist weil ich irgendwo im YYG Forum mal über memory leaks in GMs skelet-basierten Spine animationen gelesen habe. Daher lag mein verdacht dass dies der übeltäter sein könnte.
  • Jomnitech schrieb:

    Hab mal etwas gegoogelt und was in die Richtung gefunden:
    bugs.yoyogames.com/view.php?id=21622
    Scheint das es ein bekanntes Problem ist. Bin mir jetzt auch nicht sicher ob das noch gefixt wird da ja schon GMS2 draussen ist. Hmm...

    Auf dem bugreport steht dass es bereits "resolved" ist.
    Bist du auf der aktuellsten GM Studio version? Falls nicht, update. Falls schon dann heisst es einfach dass dieser Bug entweder nicht behoben wurde oder mit einem neuen Update wieder eingeführt wurde. In dem fall würde ich einen neuen Bugreport submitten.
  • Bin da etwas verwirrt. Im helpdesk kann ich doch nur zeugs nachschlagen und nicht bugs melden?
    Edit: Ok habs gefunden, war nicht angemeldet....
    Edit2: Ist sogar mein erster Bug-Report dabei :P . War mir nicht ganz klar wie ich dahin komme.
    Edit3: Hab sogar nen alten Bug-Report gefunden, da ging es über nen Monat bis ich ne Antwort hatte, hoffe diesesmal sind die Jungs schnelller...

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