Surface bei großen Raum -> Keine gute Idee

  • Allgemein

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

  • Surface bei großen Raum -> Keine gute Idee

    Hallo ihr lieben,

    Ich habe hier eine Surface zur Verfügung und der Raumgröße beträgt 2048x2048. Da jeder Level ein andere Raumgröße gibt, gibt es Probleme bei Surface: Je größer der Raum ist, desto ruckelt es mehr.
    Das ist ja schon irgendwie klar, das es mehr laggt, wenn man "surface_create(room_width,room_height)" macht:

    GML-Quellcode

    1. if surface_exists(surf){
    2. draw_surface(surf,0,0);
    3. if instance_exists(objDecal){
    4. surface_set_target(surf);
    5. with(objDecal){
    6. if speed < 0.1{
    7. if dist > 0 draw_sprite_ext(sprite_index,image_index, x + dist, y+dist, image_xscale,image_yscale, image_angle,c_black, 0.3)
    8. draw_sprite_ext(sprite_index,image_index, x, y, image_xscale,image_yscale, image_angle,c_white, 1)
    9. instance_destroy();
    10. }
    11. }
    12. surface_reset_target();
    13. }
    14. }
    15. else
    16. {
    17. surf = surface_create(room_width,room_height);
    18. surface_set_target(surf);
    19. draw_clear_alpha(c_black, 0);
    20. surface_reset_target();
    21. }
    Alles anzeigen


    Hat jemand eine Idee, wie ich das am besten machen kann? Der Objekt (Wie Munition, Einschlagskrater, Blut, tote Enemys) wird einmal auf Surface gezeichnet und dann wird der Objekt gelöscht aber bei Surface ist es immer noch zu sehen und so möchte ich es auch haben. Daher bringt surface_create(view_wview[0],view_hview[0] nicht weiter.
    Warum ich Objekt lösche? >> Es macht ja sinnlos, wenn jeder Blutspuren, Munitionen, Einschlagskrater etc. aus Objekt besteht und nie gelöscht wird (und das ist Performancelastig), daher macht es viel mehr Sinn, wenn man das auf Surface zeichnet... nur Surface ist gerade auch nicht Performancefriedlich...
    Gibt es da noch eine andere Möglichkeiten?

    Auf Antwort würde ich mich sehr freuen!

    Gruß, China
    Ihr stinkt.

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

  • Hallo Chinafreak,

    ich glaub da gibt es keinen Weg herum (um die Surfaces). Das einzige was du machen könntest, wäre einfach meherer Surfaces zu machen (bei einem 2000*2000 großen Raum z.B: 4 zu je 500*500). Ob das jedoch performanter ist weiß ich nicht.

    LG Afroman
  • Afroman schrieb:

    Hallo Chinafreak,

    ich glaub da gibt es keinen Weg herum (um die Surfaces). Das einzige was du machen könntest, wäre einfach meherer Surfaces zu machen (bei einem 2000*2000 großen Raum z.B: 4 zu je 500*500). Ob das jedoch performanter ist weiß ich nicht.

    LG Afroman


    Hmm, das ist zwar nicht der beste Lösung, aber immerhin ist es schon mal was ^^
    Ich werde mal Surface-Zerteilen versuchen... Aber ich denke mal, das es genau so schlimm ist...
    Falls ihr Ideen habt, würde ich mich natürlich sehr freuen, wenn ihr hier schreiben würdet.
    Ihr stinkt.
  • Was für eine GPU hat dein Rechner?
    Kann mir ehrlich gesagt nicht so ganz vorstellen dass eine einzige 2K Surface zu perfomanceproblemen führen sollte. (Es sei denn der Rechner ist zu schwach.)
    Soweit ich weiss sollen Surfaceberechnungen auf der GPU verlaufen. Hat diese nicht genug power, kann es zu performanceproblemen kommen. (Dabei reden wir von Onboard GPUs die für sowas nicht ausgelegt wurden)
    Ich habe bei einigen meiner Projekte mehrere Surfaces verwendet, wobei einige davon schon an Full-HD auflösung kamen. Da wurde z.B: eine Surface in der größe von 1920*1080 als Framebuffer verwendet, auf welche die ganze 3D Szene gerendert wurde.
    Dies wurde dann noch in Kombination mit weiteren Surfaces verwendet (1280*720 px) um z.B: Post processing Effekte zu ermöglichen.
  • LEWA schrieb:

    Was für eine GPU hat dein Rechner?
    Kann mir ehrlich gesagt nicht so ganz vorstellen dass eine einzige 2K Surface zu perfomanceproblemen führen sollte. (Es sei denn der Rechner ist zu schwach.)
    Soweit ich weiss sollen Surfaceberechnungen auf der GPU verlaufen. Hat diese nicht genug power, kann es zu performanceproblemen kommen. (Dabei reden wir von Onboard GPUs die für sowas nicht ausgelegt wurden)
    Ich habe bei einigen meiner Projekte mehrere Surfaces verwendet, wobei einige davon schon an Full-HD auflösung kamen. Da wurde z.B: eine Surface in der größe von 1920*1080 als Framebuffer verwendet, auf welche die ganze 3D Szene gerendert wurde.
    Dies wurde dann noch in Kombination mit weiteren Surfaces verwendet (1280*720 px) um z.B: Post processing Effekte zu ermöglichen.

    einzige würde ich nicht sagen, es sind noch 1 weitere Surface, welche es nur unter Views läuft ^^ Surface einfach zeichnen kann mein Rechner ertragen, aber wenn der ObjDecal existiert

    GML-Quellcode

    1. if instance_exists(objDecal){
    2. surface_set_target(surf);
    3. with(objDecal){
    4. if speed < 0.1{
    5. if dist > 0 draw_sprite_ext(sprite_index,image_index, x + dist, y+dist, image_xscale,image_yscale, image_angle,c_black, 0.3)
    6. draw_sprite_ext(sprite_index,image_index, x, y, image_xscale,image_yscale, image_angle,c_white, 1)
    7. instance_destroy();
    8. }
    9. }
    10. surface_reset_target();
    11. }
    Alles anzeigen


    Dann habe ich von ~450FPS nach 4~6FPS... Da der Surface gerade versucht, etwas darauf zu malen...

    GPU habe ich NVIDIA Geforce 8600 GT... zwar alt, sollte aber noch ausreichend sein... oder? ?(
    Ihr stinkt.
  • GPU habe ich NVIDIA Geforce 8600 GT... zwar alt, sollte aber noch ausreichend sein... oder? ?(

    Mein Standrechner besitzt eine Geforce 9600GT. Hab mit den GM bis dato keine Probleme gehabt. Blos mit High-end triple-A games kommt er nicht wirklich klar.
    Deine sollte eigentlich ausreichen. Sofern du sie nicht mit zu viel Aufgaben bombardierst, sollten surfaces ohne großen probleme laufen.

    Dann habe ich von ~450FPS nach 4~6FPS... Da der Surface gerade versucht, etwas darauf zu malen...

    Wieviele Decal-objekte werden denn pro step gezeichnet?
    Hast du evtl ein simples example das dieses Problem visualisiert? So könnte ich dieses auf meinem Rechner ausprobieren und evtl. die Ursache dafür finden.

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

  • LEWA schrieb:

    GPU habe ich NVIDIA Geforce 8600 GT... zwar alt, sollte aber noch ausreichend sein... oder? ?(

    Mein Standrechner besitzt eine Geforce 9600GT. Hab mit den GM bis dato keine Probleme gehabt. Blos mit High-end triple-A games kommt er nicht wirklich klar.
    Deine sollte eigentlich ausreichen. Sofern du sie nicht mit zu viel Aufgaben bombardierst, sollten surfaces ohne großen probleme laufen.

    Dann habe ich von ~450FPS nach 4~6FPS... Da der Surface gerade versucht, etwas darauf zu malen...

    Wieviele Decal-objekte werden denn pro step gezeichnet?
    Hast du evtl ein simples example das dieses Problem visualisiert? So könnte ich dieses auf meinem Rechner ausprobieren und evtl. die Ursache dafür finden.


    Ich habe mir jetzt extra Mühe gemacht, so das du alle Informationen über Decal, Surface, FPS und Raumgröße hast >>

    dl.dropbox.com/s/99ty8srb3xcim77/SurfaceDecalObject.gmz



    Mit dieser Projekt läuft bei mir alles bis 2000x2000 flüssig... ab 5000x5000 ruckelt es sehr heftig (plötzlich 5 FPS und Absturzgefahr) und ab 10000x10000 stürzt es komplett ab.
    Ihr stinkt.

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

  • Ab wieviel decals bzw ab welcher Surfacegröße bekommst du die Probleme?

    Ich habe das example auf meinem Rechner (mit dem Windows exportmodul) ausgeführt und bekomme akzeptable performance:


    Ab wann kommen die Probleme bei dir?
    Was für eine CPU hast du?

    /Edit: UPS! Habe den Post nicht zuendegelesen. Teste das nochmal und editier meine Antwort hier rein.
  • LEWA schrieb:

    Ab wieviel decals bzw ab welcher Surfacegröße bekommst du die Probleme?

    Ich habe das example auf meinem Rechner (mit dem Windows exportmodul) ausgeführt und bekomme akzeptable performance:


    Ab wann kommen die Probleme bei dir?
    Was für eine CPU hast du?


    Kein Wunder bei 1500x1500 größe, versuchs mal mit 5000x5000, indem du die Raumgröße mit Pfeiltaste nach rechts klickst veränderst :D

    P.S.

    Spoiler anzeigen

    Ich habe mehr FPS bei 1500x1500 als du oO




    CPU:



    EDIT:

    bei 5000x5000, da kriege ich erst Problem, indem ich Blutspuren oder Munition spawne/erstelle lasse.
    Ihr stinkt.
  • Ich habe mehr FPS bei 1500x1500 als du oO

    bei mir "flackerten" die FPS zwischen 700 und 1200. Habe den falschen moment für einen Screenshot erwischt. (oder snipping tool hatte mit den niedrigen FPS was zu tun)

    Bei 5000*5000 FPS verändert sich die Performance praktisch kein Stück.

    Das einzige FPS problem dass ich hatte, war eine niedrige FPS zahl beim erstellen der Bluteffekte und Kugelhülsen. (die FPS gingen auf ca 20-30 FPS runter)
    Habe ich die Maus losgelassen, lief das wieder auf ca 800 FPS.

    Das witzige ist, dass ich kurz den Fokus des Spielfensters vom Spiel auf GM:Studio gewechselt habe und wieder zurück. Danach lief das Spiel komplett flüssig, ohne FPS Probleme.
    Selbst das erstellen der Decals hat zu keinem FPS absturz geführt. (Seit dem einem mal habe ich keinerlei FPS probleme)
    Was der FPS einbruch am anfang bei mir sein sollte, weiss ich nicht.

    Hier mal meine PC-Daten:


    10000*10000 führt zu einem Absturz, da die Textur einfach zu groß wird. Dagegen kann man wohl nichts machen.

    /Edit: Warte mal, nutzt du Windows 8?
  • LEWA schrieb:

    Ich habe mehr FPS bei 1500x1500 als du oO

    bei mir "flackerten" die FPS zwischen 700 und 1200. Habe den falschen moment für einen Screenshot erwischt. (oder snipping tool hatte mit den niedrigen FPS was zu tun)

    Bei 5000*5000 FPS verändert sich die Performance praktisch kein Stück.

    Das einzige FPS problem dass ich hatte, war eine niedrige FPS zahl beim erstellen der Bluteffekte und Kugelhülsen. (die FPS gingen auf ca 20-30 FPS runter)
    Habe ich die Maus losgelassen, lief das wieder auf ca 800 FPS.

    Das witzige ist, dass ich kurz den Fokus des Spielfensters vom Spiel auf GM:Studio gewechselt habe und wieder zurück. Danach lief das Spiel komplett flüssig, ohne FPS Probleme.
    Selbst das erstellen der Decals hat zu keinem FPS absturz geführt. (Seit dem einem mal habe ich keinerlei FPS probleme)
    Was der FPS einbruch am anfang bei mir sein sollte, weiss ich nicht.

    Hier mal meine PC-Daten:


    10000*10000 führt zu einem Absturz, da die Textur einfach zu groß wird. Dagegen kann man wohl nichts machen.

    /Edit: Warte mal, nutzt du Windows 8?

    Zum Glück brauche ich 10000x10000 Räume nicht :D
    Wir haben fast haargenau gleiche PC-Daten D: Ja ich benutze Windows 8 (heute frisch auf 8.1 installiert).
    Ihr stinkt.
  • Chinafreak schrieb:

    Wir haben fast haargenau gleiche PC-Daten D: Ja ich benutze Windows 8 (heute frisch auf 8.1 installiert).

    Dann habe ich eine Vermutung, was die Ursache sein könnte. (und die dir nicht gefallen wird.)

    Ich habe vor ca. 3-4 Monaten Celaria (GM8.1 Version) auf dem Windows 8 Laptop eines Kumpels ausgeführt.
    Was ich damals bemerkt habe ist, dass das Game auf dem Laptop katastrophal langsam lief. (FPS einbrüche von 60 auf 30 FPS) wobei die Technischen Daten des Lapis wesentlich besser waren als die des meinen.
    Celaria nutzte sehr viele Surfacebasierte Effekte.
    Anfangs nahm ich an dass der Laptop irgendeinen Fehler in den Energieoptionen hatte. (z.B: dass er im Stromsparmodus lief anstatt den I7 Prozessor und GPU hochzutakten)
    Jedoch kam dann auch die weitere Vermutung zutage, und zwar dass Windows 8 irgendein Problem mit den Surfaces hatte. (Da solche Probleme auf keinen anderen Lapi oder PC mit Windows 7 auftauchten)
    (Wir hatten leider keine anderen Win8 rechner auf denen wir das testen konnten um dieses Problem zu bestätigen.)

    Nunja... Ich dachte dieses Problem mit der niedrigen Performance bei Surfacenutzung (auf Win8 ) wäre nur ein GM 8.1 Phänomen. Aber anscheinend hat GM: Studio genau dieselben Probleme wie GM 8.1
  • LEWA schrieb:

    Chinafreak schrieb:

    Wir haben fast haargenau gleiche PC-Daten D: Ja ich benutze Windows 8 (heute frisch auf 8.1 installiert).

    Dann habe ich eine Vermutung, was die Ursache sein könnte. (und die dir nicht gefallen wird.)

    Ich habe vor ca. 3-4 Monaten Celaria (GM8.1 Version) auf dem Windows 8 Laptop eines Kumpels ausgeführt.
    Was ich damals bemerkt habe ist, dass das Game auf dem Laptop katastrophal langsam lief. (FPS einbrüche von 60 auf 30 FPS) wobei die Technischen Daten des Lapis wesentlich besser waren als die des meinen.
    Celaria nutzte sehr viele Surfacebasierte Effekte.
    Anfangs nahm ich an dass der Laptop irgendeinen Fehler in den Energieoptionen hatte. (z.B: dass er im Stromsparmodus lief anstatt den I7 Prozessor und GPU hochzutakten)
    Jedoch kam dann auch die weitere Vermutung zutage, dass Windows 8 irgendein Problem mit den Surfaces hatte. (Da solche Probleme auf keinen anderen Lapi oder PC mit Windows 7 auftauchten)
    (Wir hatten leider keine anderen Win8 rechner auf denen wir das testen konnten um dieses Problem zu bestätigen.)

    Nunja... Ich dachte dieses Problem mit der niedrigen Performance bei Surfacenutzung wäre nur ein GM 8.1 Phänomen. Aber anscheinend hat GM: Studio dieselben Probleme mit Windows 8.


    Hmm, dann muss ich mir mal nachschauen. Entweder saugt Windows 8 zu viel GPU oder das ist ein Bug von Game Maker (eigentlich ist ja Microsoft's Schuld ^^)
    Ich wende mich mal an YoYoGames-Supporter. Danke für deiner Mühe & Aufmerksamkeit! Du hast ein Kuss von mir verdient! :P
    Ihr stinkt.
  • Gerade auf Win8 getestet:

    10.000 x 10.000 stürzt sofort nach dem compilen ab.
    5.000x5.000: real_fps zwischen 700-1400 @ room_speed 60. Beim erstellen einer neuen surface (blut, munition fallen lassen) geht die FPS auf ca. 10-20 runter, sowohl die aktuelle fps wie auch real_fps.

    Von einer so großen Surface würde ich dir abraten, auch wenn daran der tolle Effekt verlorengeht.
    Eine alternative Lösung wäre, jeweils kleinere Surfaces zu zeichnen, in den Bereichen wo die Hülsen/Blut dargestellt werden soll.
  • Ich kenne mich um ehrlich zu sein nicht so gut damit aus, aber könntest du das nicht einfach nur im View zeichnen lassen ?
    So, dass das Surface immer mit geht ?

    Ich hab ein mal mit einem Surface gearbeitet, wo ich dynamische Licht Effekte brauchte und dort hat es super funktioniert.
  • Nico001 schrieb:

    Ich kenne mich um ehrlich zu sein nicht so gut damit aus, aber könntest du das nicht einfach nur im View zeichnen lassen ?
    So, dass das Surface immer mit geht ?

    Ich hab ein mal mit einem Surface gearbeitet, wo ich dynamische Licht Effekte brauchte und dort hat es super funktioniert.


    view_surface_id[0]? Da der Objekt, der jetzt auf Surface gezeichnet wurde, gar nicht mehr existiert, kann ich das leider nicht mehr umsetzen. (Warum den wohl? Kein Bock zu sagen :P)
    Aber komischerweise buggt/laggt/ruckelt es bei mir nicht mehr, wenn ich die größe 5000x5000 nehme und dann Munition/Blut spuren hinterlasse. Keine Ahnung wieso... 8|
    Ihr stinkt.