Partikel System Slow Downs

  • Allgemein

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

  • Partikel System Slow Downs

    Ja Partikel...
    Also ich erkläre mal...

    Ich habe ein Objekt mal 20 (+- 15) dies hat einen Emitter im Step Event.
    Wenn dieses Objekt mit einen bestimmten Objekt Kollidiert dann wird es Zerstört und das Partikel System auch:
    "part_system_destroy(Partflowback);"

    Jedoch wenn es 5 mal gecallt wird fangen slow downs an nach dem ersten slow down bei jedem weiteren male 5 FPS pro call...

    Natürlich sieht es danach aus das, das Partikel System NICHT zerstört wird das kann aber doch gar nicht sein....
    Ich hoffe das einer von euch vllt. eine Lösung für dieses Problem hat.

    vielen dank fürs lesen.

    PS: Desweiteren sind über 5 Part. Systeme im Betrieb die auch reibungslos funktionieren.
    (EDIT: Das dieser Thread 2 mal erstellt wurde war nicht meine schuld das war ein SQL error ;( )

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

  • Puh, schwer zu sagen, ohne allen Code zu sehen.
    Aber mich wundert eins - ein Partikelsystem das nicht feuert, braucht doch keine Ressourcen? Soll heißen, es wäre eigentlich kein Problem, wenn die Systeme nicht zerstört würden (zumindest nicht mit solcher Auswirkung). Vielleicht täusche ich mich auch.

    Fehler, die oft gemacht werden sind, dass falsche Variablen zum zerstören genutzt werden. Es gibt z.B. Particle Editoren für GM, die falschen Code erzeugen. Etwa ein System erstellen, in eine Variable speichern, und diese dann mit einem Type überschreiben. Das kann dann trotzdem funktionieren, nur sind dann zum zerstören die nötigen Variablen nicht mehr vorhanden.
    Wenn du es ganz sauber machen willst, solltest du alle Bestandteile in umgekehrter Reihenfolge (zu der Erstellreihenfolge) wieder zerstören, mit folgenden Funktionen:

    GML-Quellcode

    1. part_attractor_destroy(ps,ind);
    2. part_changer_destroy(ps,ind);
    3. part_deflector_destroy(ps,ind);
    4. part_destroyer_destroy(ps,ind);
    5. part_emitter_destroy(ps,ind);
    6. part_system_destroy(ind);
    7. part_type_destroy(ind);

    Mein Tipp an dieser Stelle wäre aber:
    Erstelle dein System nur einmal, etwa in einem Controller-Objekt oder als globale Variablen und lass dann alle deine Objekte den Emitter verwenden.
    Dann musst du immer nur ein System erstellen und zerstören.
  • Ich gebe zu das ich nicht so das wissen über Partikel Systeme besitze...
    Es könnte natürlich sein das ich unnötiger weise immer wieder etwas erstelle...

    Also.

    External SCR "Partflowback":
    Spoiler anzeigen

    GML-Quellcode

    1. ps1 = part_system_create();
    2. pt1 = part_type_create();
    3. part_type_shape(pt1,6);
    4. part_type_size(pt1,0.50,1,-0.02,0);
    5. part_type_color3(pt1,argument0,argument0,argument0);
    6. part_type_alpha3(pt1,1,0.50,0);
    7. part_type_speed(pt1,3,3,0,0);
    8. part_type_life(pt1,50,50);
    9. part_type_direction(pt1,0,360,4,0);
    10. part_type_orientation(pt1,0,360,0,0,1);
    11. part_type_gravity(pt1,0,270);
    12. part_type_scale(pt1,1,1);
    13. part_type_blend(pt1,0);
    14. part_system_depth(ps1,-1000)
    15. ps1 = part_emitter_create(ps1);
    16. part_emitter_region(ps1,ps1,x,x,y,y,ps_shape_rectangle,ps_distr_linear);
    17. part_emitter_burst(ps1,ps1,pt1,15);
    Alles anzeigen


    Dieses rufe ich in jedem Step event:

    GML-Quellcode

    1. Partflowback()


    Wie erwähnt wird dieses System beim auftreffen Zerstört:
    part_system_destroy(Partflowback);
  • Also,
    1. Du tust genau das, was ich gesagt habe. Einmal speicherst du im Script ein System in die Variable "ps1" und überschreibst diese mit einem Emitter. Das funktioniert dann trotzdem noch, um Partikel zu erzeugen, aber für den Emitter solltest du eine extra Variable "pe1" benutzen, oder so. Demnach würde dann "part_emitter_region" nicht zweimal den Parameter "ps1" erwarten, sondern einmal das System und einmal den Emitter. Und zum Zerstören könntest du dann Emitter, Type und System getrennt voneinander zerstören.
    2. Das eigentliche Problem ist aber eher dein "part_system_destroy(Partflowback);", denn ich sehe hier nirgends eine Variable namens "Partflowback"! Hier musst du normal die "ps1" angeben (welche du aber bereits mit einem Emitter überschrieben hast - könnte aber trotzdem richtig funktionieren, weiß ich grad nicht).
  • Danke für eure Antworten...also quasie Noob Alert....

    Wie calle ich das Partikel system denn korrekt?
    (Das mit dem Zerstören klappt trotzdem verursachen viele objekte 20 + Slow Downs)

    Also liegt der Fehler dadrin das ich das System zu oft calle....
    Erlich gesagt kenne ich aber nur diese Methode xD (Auch wenn es falsch ist).

    Wichtig wäre ja das mehrere Objekte das gleiche System gleichzeitig verwenden.

    EDIT:"part_particles_create(pe7, x, y, pt1, 10);" so mache noch ein paar long time tests ob das nun alles funktioniert danke ;)

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

  • Erstelle das Partikelsystem nur einmal, beim Spielstart, und speichere es in eine globale Variable. Deine Objekte können dann jederzeit darauf zugreifen.

    GML-Quellcode

    1. part_emitter_region(global.ps1,global.ps1,x,x,y,y,ps_shape_rectangle,ps_distr_linear);
    2. part_emitter_burst(global.ps1,global.ps1,global.pt1,15);
    Wobei du natürlich auch die Position immer an jedes Objekt anpassen musst.
    (Und weiterhin bietet sich an den Emitter in eine extra Variable zu schreiben.)

    Bevor du dein Spiel dann beendest, rufst du das Zerstören nur einmal auf:

    GML-Quellcode

    1. part_system_destroy(global.ps1);
    (Wobei du auch sauber vorgehen könntest und erst Emitter und Type zerstörst...)
  • Vielen lieben dank...
    Die Position regel ich im Step hiermit:"part_particles_create(pe7, x, y, pt1, 10);".
    Mache noch ein paar langzeit Tests umzugucken ob da nicht doch noch irgendwo anders was schief laüft ^^.

    Vielen Herzlichen dank ;)