Trying to use non-existing surface

  • Trying to use non-existing surface

    Hi
    schon seit einer Zeit hab ich immer wieder Probleme mit dieser Fehlermeldung

    Das Problem ist, dass diese Fehlermeldung nicht auf meinem Pc kommt sondern auf etwas älteren rechnern und ich deswegen nicht einfach so versuchen kann den fehler zu beheben. Denn ich kann den fehler leider auf meinem PC nicht sehen. Er zeigt ihn mir nicht.
    Deswegen kann ich leider nicht an Blayzer weiterarbeiten, weil das Spiel wahrscheinlich bei fast allen Pc's mit weniger als 3000 mhz nicht klappen wird. Es lohnt sich dann einfach nicht

    Bei einem alten Spiel von mir kam der Fehler auch ab und zu beim "transition example"
    er kam manchmal und manchmal nicht und ich weiß leider nicht wieso.

    Bei Blayzer kommt der fehler wegen dem Motion Blur ab und zu am Ende eines Levels.
    Also das ganze Level klappt. Eigentlich sogar bis zu Level 5.
    Und dann am Ende von Level 5 oder so kommt plötzlich der Fehler.
    Bloß wieso???
    Ich hoffe ihr könnt mir helfen :( :( :(
    Die Schönheit liegt im Auge des Betrachters :D
  • Wieviel MB Grafikkartenspeicher haben die PCs, bei denen das auftritt?
    Und hast du wirklich sichergestellt das unter allen Umständen vor dem Zeichnen auf das Surface das Surface erstellt wird?
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Okay, gehn wir mal davon aus das es nicht dein Script ist wo das passiert. Irgendwo in deinem Spiel wird ein Surface erzeugt, nur dann, wann es benötigt wird ist es nicht mehr da. Surfaces verschwinden nicht einfach so, aber es kann schon vorkommen das sie gelöscht werden, wenn du z.b. die Bildschirmauflösung änderst. Check ein einfach die Funktionen, welche bei den Fehlerobjekten aufgerufen werden und überprüfe einfach ob das Surface noch vorhanden ist bevor du dieses zeichnest.
    ...

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

  • Da ich einen nicht so guten PC hab (800 MHz, 128 MB Grafik, 512 MB RAM), hat er mich gebeten, sein Spiel zu testen. Siehe meine Systemangaben.

    EDIT: Er sagt es liegt an den lahmen PCs. Sie benutzen Surfaces, bevor si geladen werden. Das is das Problem...

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

  • Das ist aber eigentlich nicht möglich, da Game Maker Befehl für Befehl abarbeitet. D.h. das er erst den nächsten Befehl anfängt wenn der aktuelle fertig ist, er macht nach dem Erstellen des Surface erst weiter wenn sie komplett fertig ist.
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • @Merko: Das ist doch Schwachsinn. Wenn im Code erst das Surface erstellt und dann darauf gezeichnet wird, kann es doch nicht von PC zu PC Unterschiede geben. Der Code wird jedesmal gleich ausgeführt. Dafür muss es eine andere Erklärung geben. Da würde es mir logischer erscheinen, wenn die "schwachen" PCs es nicht schaffen, das Surface zu erzeugen und dann dadurch diese Fehlermeldung herauf beschwören.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Das ist auch unwahrscheinlich, da Surfaces nichts mit der Leistung des PCs sondern nur mit dem Ram der Grafikkarte zu tun haben, in dem die sich befinden. Habt ihr das auch schon auf anderen schnellen PCs benutzt um wirklich mit Sicherheit sagen zu können das das nur auf langsamen passiert?
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • mein pc ist neu und schnell^^ und bei mir kam kein einziges mal ein fehler bei blayzer.
    aber bei 3-4 andere PC's von freunden kommen immer fehler...
    bei einem kommt es nach jedem levelende
    bei anderen nur bei level 5
    und bei anderen nach zufall...

    @mauge:
    ne schwachsinn ist das nicht so ganz...
    ich frage mich auch waurm der fehler ab und zu kommt und manchmal nicht.
    Denn der code ist ja immer gleich und verändert sich nicht.
    Aber trotzdem klappt es manchmal und manchmal nicht...
    Ich habe immer gedacht das das surface im nächsten level erstellt wird und das alte surface vielleicht nicht gelöscht wird und deswegen fehler kommen könnten.
    Aber nun glaube ich das er das surface zerstört wenn er ins nächste level will. und kurz nachdem zerstören will er es nochmal drawn.
    wie zerstört man überhaupt surfaces ganz?^^
    Die Schönheit liegt im Auge des Betrachters :D

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

  • so etwas ähnliches ist mir auch schon passiert ich hab eine variable definiert und danach benutzt und der gm sagt das die variable nicht definiert ist ich. hab einfach eine if abfrage eingebaut ob die variable existiert danach war der fehler weg,
    ich hatte mich auch nicht verschrieben oder so ganz komisch(war zwar noch gm 6.0 kA obs ein bug ist oder mein pc irgendwas hatte heute kann ich den fehler nichtmehr reproduzieren)

    aber ein fehler der zufällig auftritt wie soll das bitte gehen, rufst du das script per zufall auf?
  • estell mal gaaaanz viele sprites alle mit preload an
    und siehe die meldung kommt

    ich hab herausgefunden, dass wenn man bei allen sprites das preload wegmacht
    und alle surfaces ganz am anfang kreiert+
    der fehler nichtmehr auftritt

    es ligt meines wissens daran, dass wenn der ram zu voll ist
    der gm keine surfaces mehr erstellen kann

    also kann es auch an nebenherlaufenden progs liegen

    iTeM
  • also jetzt bin ich ma neugierig^^
    für was ist ist das preload ding eigentlich?^^
    und bleibt ein surface eigentlich das ganze spiel über?
    oder wird es automatisch nach jedem level zerstört...
    denn mein spieler erstellt nach jedem level ein neues surface.
    und ich weiß nicht ob er sie wieder zerstört...
    surface_reset_target()
    steht bei mir im code auch drinn

    ach hier ist ma der ganze code^^

    create event:

    GML-Quellcode

    1. window_w = window_get_region_width();
    2. window_h = window_get_region_height();
    3. buffer = surface_create(window_w,window_h);
    4. surface = surface_create(window_w,window_h);
    5. blur_amount = 1
    6. fx = window_w/display_get_width();
    7. fy = window_h/display_get_height();
    8. set_automatic_draw(0);
    9. draw_clear(c_black);


    end step event:

    GML-Quellcode

    1. blur_amount = room_speed/45
    2. surface_set_target(buffer);
    3. draw_clear_alpha(c_black,0);
    4. screen_redraw();
    5. surface_set_target(surface);
    6. draw_clear_alpha(c_black,1);
    7. draw_set_blend_mode_ext(7,11);
    8. draw_surface(buffer,0,0);
    9. draw_set_blend_mode(bm_normal);
    10. surface_reset_target();
    11. d3d_transform_set_identity();
    12. d3d_transform_set_scaling(fx,fy,0);
    13. draw_surface_ext(surface,0,0,1,1,0,c_white,blur_amount);
    14. d3d_transform_set_identity();
    15. screen_refresh();
    Alles anzeigen
    Die Schönheit liegt im Auge des Betrachters :D

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

  • @Andyworld: Genau das meinte ich auch. Es kann einfach nicht am Code liegen, weil der bei jedem Rechner gleich ausgeführt wird. Aber das mit der Preload Funktion macht Sinn. Preload kannst du dir eigentlich mit "Vorladen" übersetzen und dann weisst du auch, was es bedeutet. ;)
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Preload bedeutet einfach das die sprites (ode rauch bg's etc.) beim start des speils in den Ram geladen werden und somit schneller aufgerufen werden können.
    Wenn die funktion aus ist werden die sprites erst bei benutzen geladen, spart ram kann aber auch zu ungewünschten rucklern führen.
    Eigenes Ressourcen managment ist wie ich finde am besten.
    Face in the wind, we're riding the storm
    We'll stay our course whatever will come
    ~~ Stay (Running) Wild ~~
  • juhuuuuuuuu!!!!!!!!
    the master of the universe hat dat geheimnis wiedermal gelöst^
    ne scherz bei seite^^
    ich weiß nun endlich warum der fehler kam
    es lag nicht am code.
    es liegt eindeutig am pc.
    die langsamen pc's sind nicht in der lage viele surfaces gleichzeitig zu erstellen.
    also bei meinem pc kahm der fehler wahrscheinlich nur weil ich mal zu viele surfaces hatte
    (jedes level erstelt zusätzlich ein surface
    und irgendwann waren es zu viele zusammen)
    das spiel hat bei meinem freund net funktioniert weil er nen total alten pc hatte und nichtmal 2 surfaces erstellen konnte.

    leider habe ich erst vor kurzem gemerkt das man beim game_start ein surface erstellen kann und es für das ganze spiel haltet.
    vorher hat er immer wieder bei jedem level eins dazugefügt.
    und ich glaube das er z.b. nach 9 surfaces kein zusätzliches erstellt und dann die variable leer ist die er zeichnen will
    also hab ich die variable "surface" einfac zu "global.surface" gemacht und ins game_start gestellt :D :D :D

    problem gelöst :D :D :D
    und danke für eure hilfe, ansonsten wäre ich nie darauf gekommen :P
    Die Schönheit liegt im Auge des Betrachters :D

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

  • Surfaces werden mit dem wechseln des rooms NICHT gelöscht!
    das musst du mit surface_free() selbst erledigen!
    Wenn in jedem level eine neue surface gebaut wird ohne die alten vorher zu löschen, ist der Videospeicher irgendwann voll und die Surface wird nicht mehr kreiert.

    Was dann passiert steht ja in der ersten post...
    Kreier das Motionblur objekt nur EIN MAL und mach das dan persistant.
    Ich gehe mal davon aus, das dieses Ding Surfaces baut.