Code Error: surface stack is full

  • GM 8

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

  • Code Error: surface stack is full

    Neue Version von GameMakerStudio und wieder funktioniert irgendwas nicht was vorher lief.

    Code Error: surface stack is full - ensure surface_reset_target() is called for each surface_set_target().

    Ich kann mir zwar denken in welche Richtung der Fehler geht, aber falls jemand genauere Informationen darüber hat, wäre das schön :)
    Das Programm hält zwar an, aber es ist wieder schwierig herauszufinden wo da einem zu wenig Informationen gegeben werden :(

    ERROR!!! :: surface stack is full - ensure surface_reset_target() is called for each surface_set_target().
    ERROR!!! :: Unbalanced surface stack. You MUST use surface_reset_target() for each set.


    GML-Quellcode

    1. /// Draw Surfaces
    2. /*
    3. Globale Änderungen:
    4. draw_set_blend_mode(bm_normal);
    5. surface_reset_target();
    6. */
    7. draw_set_blend_mode(bm_normal);
    8. surface_set_target(sf_DEST);
    9. if(obj_DEBUG.var_debopt_draw_ext == true) // DEBUG-MODUS SPERRE
    10. { // Bodeneffekte (Auswahl Boden Effekt Filter)
    11. draw_surface(sf_ABEF, 0, 0); // Bodentextur (TAURON)
    12. draw_surface(sf_ABE2, 0, 0); // Extratextur zusätzlich zu Bäumen ect.
    13. draw_surface(sf_ABE3, 0, 0); // Berge, Wege, Zusätzliche Gräser ect.
    14. // Objektebene (Auswahl Objekt Licht Filter)
    15. draw_surface(sf_AOLF, 0, 0);
    16. // Sonnenschatten (Auswahl Sonnen Schatten Filter)
    17. draw_surface_ext(sf_ASSF, 0, 0, 1, 1, 0, c_black, 0.5);
    18. // Serverübergangs-WOLKEN
    19. draw_surface(sf_ASWF, 0, 0);
    20. // Tag Nacht Zeit Layer
    21. draw_set_blend_mode_ext(var_blendMODEa[3], var_blendMODEb[3]);
    22. draw_surface(sf_TNZL, 0, 0);
    23. draw_set_blend_mode(bm_normal);
    24. if(obj_DEBUG.var_debopt_dimension == true)
    25. { surface_set_target(sf_ASSF);
    26. for(i = 0; i < view_hview[0]; i = i + 3) // Formel zum umwandeln des Surfaces in ein Trapez
    27. { draw_p = i / view_hview[0];
    28. draw_m = draw_p - 0.5;
    29. draw_w = 2.5
    30. draw_x = 1 - draw_m * view_wview[0] / (draw_w * draw_w);
    31. draw_surface_part_ext(sf_DEST, 0, i, view_wview[0], 3, draw_x, i, 1 + (draw_m / (draw_w * (draw_w/2))), 1, c_white, 1);
    32. }
    33. surface_set_target(sf_DEST);
    34. draw_c = 10;
    35. draw_z = 0; // Zähler
    36. draw_s = 5; // Schrumpffaktor // HHHHHHIIIIIEEEERRRR
    37. for(i = 0; i < view_hview[0]; i = i + draw_s)
    38. { draw_surface_part_ext(sf_ASSF, 0, i, view_wview[0], draw_c, 0, i - draw_s * draw_z, 1, 1 / draw_c * (draw_c - draw_s), c_white, 1);
    39. i = i + draw_c - draw_s;
    40. draw_c++;
    41. draw_z++;
    42. }
    43. surface_reset_target();
    44. draw_surface_stretched(sf_DEST, -50, 10, view_wview[0]+100, draw_z * draw_s + draw_c + view_hview[0]);
    45. }
    46. else
    47. { surface_reset_target();
    48. draw_surface(sf_DEST, 0, 0);
    49. }
    50. surface_set_target(sf_ABEF); draw_clear_alpha(0,0); // Tauron
    51. surface_set_target(sf_ABE2); draw_clear_alpha(0,0); // Zusatz Boden
    52. surface_set_target(sf_ABE3); draw_clear_alpha(0,0); // Berge, Wege, Zusatz Gräser
    53. surface_set_target(sf_AOLF); draw_clear_alpha(0,0); // Normale Objekte
    54. surface_set_target(sf_ASSF); draw_clear_alpha(0,0); // Sonnenschatten
    55. surface_set_target(sf_ASWF); draw_clear_alpha(0,0); // Wolken
    56. surface_set_target(sf_TNZL); draw_clear_alpha(0,0); // Tages nacht Zeit
    57. }
    58. // DEBUG-MODE (Auswahl Debug Mode Filter)
    59. if(DEBUG == true)
    60. { surface_set_target(sf_ADMF);
    61. surface_reset_target();
    62. draw_surface(sf_ADMF, 0, 0);
    63. surface_set_target(sf_ADMF);
    64. draw_clear_alpha(0,0);
    65. }
    66. surface_reset_target();
    Alles anzeigen


    Dies ist z.B. das DrawEvent in dem ich die Surfaces schlussendlich zusammenfüge.
    Warum ich mit so vielen Surfaces arbeit hat viele gründe, z.B. das es viele Grafiken gibt die der Client anhand von anderen Grafiken interpretiert da sie auf die eigentliche Spielmechanik keine Auswirkung haben.

    Wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht, vieleicht weis ja jemand mehr.
    Leider kann ich auch nicht wirklich sagen ob der fehler in diesem letzten DrawEvent ist oder in einem anderen Event da mir die bisherigen informationen von GM ja nicht veraten wann genau der Fehler auftritt.


    __________________________________

    Edit: 7:10 PM

    ERROR!!! :: Unbalanced surface stack. You MUST use surface_reset_target() for each set.

    Ich nehme mal an das mir diese Fehlermeldung sagen will das ich zu jedem surface_set_target(); ein surface_reset_target(); setzen muss oder?

    GML-Quellcode

    1. surface_set_target(sf_ABEF);
    2. surface_reset_target();

    __________________________________

    Edit: 7:15 PM

    Konnte den Fehler auf das DrawEvent in einem Objekt eingrenzen.
    __________________________________

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

  • Dein Problem ist, dass du die Funktion set_target 2x aufrufst und dazwischen kein reset_target aufgerufen wurde. (Zeile 31 und Zeile 39)

    Einfach vor Zeile 39 ein surface_Reset_target() aufrufen und es sollte klappen.

    Edit: Du hast ein ziemliches Durcheinander mit den Surfaces. Auf alle Fälle darfst du nicht 2x surface_set_target aufrufen ohne dazwischen kein reset_target aufzurufen.
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Balls of Steel schrieb:


    GML-Quellcode

    1. surface_set_target(sf_ABEF); draw_clear_alpha(0,0); // Tauron surface_set_target(sf_ABE2); draw_clear_alpha(0,0);
    2. // Zusatz Boden
    3. surface_set_target(sf_ABE3); draw_clear_alpha(0,0); // Berge, Wege, Zusatz Gräser
    4. surface_set_target(sf_AOLF); draw_clear_alpha(0,0); // Normale Objekte
    5. surface_set_target(sf_ASSF); draw_clear_alpha(0,0); // Sonnenschatten
    6. surface_set_target(sf_ASWF); draw_clear_alpha(0,0); // Wolken
    7. surface_set_target(sf_TNZL); draw_clear_alpha(0,0); // Tages nacht Zeit

    Also ich habe das bisher immer so verstanden, dass nach jedem surface_set_target(), wenn die entsprechende Aktion abgeschlossen ist ein surface_reset_target() gehört.
    Möglich, dass man das nicht muss(te), aber vielleicht hat es etwas mit deinem Problem zu tun. Die Error-Message würde auch darauf hindeuten.

    Was ich mir vorstellen könnte, ist dass Surfaces mit surface_set_target() aktiv gestellt werden und sich die ganzen aktiven Surfaces dann auf einem Stack anhäufen,
    vielleicht kann man nur eine bestimmte Anzahl an Surfaces "aktiv" haben, bis der Stack der die id's der Surfaces hält überläuft.
    (Vielleicht wurde dieser "Stack" mit der neuen Version verkleinert)
    Wie gesagt, sicher bin ich mir nicht, aber das ist das was ich mir darunter vorstellen könnte.^^

    Hier ist ein Ausschnitt von einem meiner Draw-Event um das zu zeigen was ich meine (bei den anderen Surfaces ist das genau so gestaltet,
    bei mir kommt niemals zwei mal surface_set_target() hintereinander ohne ein surface_reset_target() dazwischen):

    GML-Quellcode

    1. //normal map surface - drawing normal maps
    2. if global.nmenabled == 1
    3. {
    4. surface_set_target(surf_nm)
    5. draw_clear_alpha(c_black,0)
    6. draw_set_alpha(1)
    7. draw_set_color(c_white)
    8. //get starting chunk (because chunk_active_m2 is sometimes -1)
    9. if chunk_active_m2 == -1
    10. startingchunk = chunk_active_m1
    11. else
    12. startingchunk = chunk_active_m2
    13. //for objects
    14. with (all)
    15. {
    16. if object_index == all_except_controllerobjects()
    17. {
    18. if nm_index != 0 and sprite_exists(nm_index)
    19. {
    20. if obj_controller_editor.normalmappreview == 0
    21. {
    22. draw_sprite_ext(nm_index,image_index,x-view_xview,y-view_yview+obj_controller_editor.navspeed,image_xscale,image_yscale,image_angle,c_white,1)
    23. }
    24. }
    25. }
    26. }
    27. //resetting surface
    28. surface_reset_target()
    29. }
    Alles anzeigen


    /edit Rodrog hat es eigentlich ziemlich auf den Punkt gebracht.^^
  • Ich danke euch beiden für eure Antworten, das hilft mir sehr dabei das ganze in Ordnung zu bringen :)

    ______________________________

    Edit: 9:40 PM

    So, endlich alles durchforstet und immer schön mit reset abgewählt.
    Hat etwas gedauert, weil manche if abfragen und schleifen von mir einfach nicht so gedacht waren, aber schlussendlich funktionierts jetzt.
    Danke noch mal :)

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

  • Benutzer online 1

    1 Besucher