ds_grid drawing performance

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

  • ds_grid drawing performance

    hi

    Ich habe gerade was nettes gebastelt. Ich erstelle ein ds_grid (48x30). Darin setze ich Zahlen. Anhand dieser Zahlen lasse ich Sprites zeichnen. Leider muss ich für den gewünschten Effekt drei verschiedene Sprites in 3 verschiedenen Ebenen zeichnen. Somit geht das Script in jedem Step drei mal durch alle Koordinaten um zu überprüfen ob es was zu zeichnen gibt. Das Ergebnis sieht super aus. Leider geht das arg in die Perfomance. Es läuft zwar immernoch flüssig, aber gäbe es da nicht doch einen kleinen Kniff, mit dem ich das ganze beschleunigen könnte? Surfaces kommen nicht in Frage, da das ganze dynamisch bleiben soll.

    Das Ganze sieht im Drawevent so aus:

    Quellcode

    1. var xx = 0;
    2. var yy = 0;
    3. repeat(ww*hh) {
    4. c = ds_grid_get(grid_cloud,xx,yy);
    5. if (c >= 0) {draw_sprite(spr_cloud_dark,c+1,xx*z,yy*z);}
    6. xx += 1;
    7. if (xx = ww-1) {xx = 0; yy += 1;}
    8. }
    9. var xx = 0;
    10. var yy = 0;
    11. repeat(ww*hh) {
    12. c = ds_grid_get(grid_cloud,xx,yy);
    13. if (c >= 0) {draw_sprite(spr_cloud_middle,c+1,xx*z,yy*z);}
    14. xx += 1;
    15. if (xx = ww-1) {xx = 0; yy += 1;}
    16. }
    17. var xx = 0;
    18. var yy = 0;
    19. repeat(ww*hh) {
    20. c = ds_grid_get(grid_cloud,xx,yy);
    21. if (c >= 0) {draw_sprite(spr_cloud_bright,c+1,xx*z,yy*z);}
    22. xx += 1;
    23. if (xx = ww-1) {xx = 0; yy += 1;}
    24. }
    Alles anzeigen


    Vielen Dank für die Müh! <3
    PUTREFACTION ////
    ◇ ALIEN BASTARDS ◇ SLY PITCH ◇ SHOVE MASTER ◇

  • Könnte mir vorstellen, dass zwei for-schleifen statt dem repeat-konstrukt minimal performanter sind.

    Zudem frage ich mich, ob du das ganze wirklich drei mal ausführen musst oder stattdessen auch alle drei draw_sprite() Befehle hintereinander packen kannst.
  • Ich hab mal im englischen Forum geschaut wegen den for-Schleifen. Dort gabs auch eine Diskussion darüber, ob repeat loops, while loops oder eben for loops einen Unterschied machen. Es wird dort behauptet, dass es kaum merkliche Unterschiede gibt, da alle im Grunde genommen das Selbe machen würden. Ich habe es jetzt aus reiner Faulheit nicht auch noch ausprobiert. :P

    Den Unterschied mit dem nacheinander oder gleichzeitig zeichen möchte ich hier mit einem Bild verdeutlichen. Möglicherweise gäbe es hier noch eine andere Möglichkeit, den Selben Effekt zu erzielen...

    Links, wie ich es möchte. Jedes Sprite entspricht einer Farbe; also weiss, hellblau und dunkelblau. Somit erreiche ich den Überblendungseffekt. Würde ich es direkt nacheinander zeichnen, könnte ich mir das mit der Farbaufteilung gleich sparen, weil es dann genau gleich aussieht, wie wenn ich einfach ein Sprite zeichnen würde. (Rechts)
    PUTREFACTION ////
    ◇ ALIEN BASTARDS ◇ SLY PITCH ◇ SHOVE MASTER ◇

  • Vielleicht brauchst du nicht drei unterschiedliche Sprites pro Wolkenteil wenn du die Wolkenteile transparent machst und mit unterschiedlicher Größe zeichnest,
    dann könntest du das Zeichnen in einer for-Schleife zusammenfassen - sieht aber evtl. seltsam aus.

    Was aber eher funktionieren könnte ist vielleicht wenn du die einzelnen Wolkenteile mit dem Blendmodus bm_add zusammenrechnen würdest.
    Dann bräuchtest du einen ausgesuchten Blauton, und wenn sich die Teile überlappen geht die Farbe immer mehr in Richtung weiß ...
    Vielleicht funktioniert das ja.
  • RLP schrieb:

    Vielleicht brauchst du nicht drei unterschiedliche Sprites pro Wolkenteil wenn du die Wolkenteile transparent machst und mit unterschiedlicher Größe zeichnest,
    dann könntest du das Zeichnen in einer for-Schleife zusammenfassen - sieht aber evtl. seltsam aus.

    Was aber eher funktionieren könnte ist vielleicht wenn du die einzelnen Wolkenteile mit dem Blendmodus bm_add zusammenrechnen würdest.
    Dann bräuchtest du einen ausgesuchten Blauton, und wenn sich die Teile überlappen geht die Farbe immer mehr in Richtung weiß ...
    Vielleicht funktioniert das ja.

    Danke für den Input. Das wäre auch ne Lösung. Aber das würde mir die Farbpalette ruinieren. Meine Wolken bestehen aus genau 3 Farben plus Hindergrundfarbe. Würde ich alles überblenden lassen, würde viele Farbabstufungen mehr entstehen. Ich bin da einfach heikel. :/

    TrunX schrieb:

    Indem Fall würde ich es tatsächlich mal mit dem bm_add blendmode probieren oder die Wolke einmal auf eine Surface zeichnen und diese dann verwenden.

    Das mit der Surface würde tip top funktionieren. Aber dann wäre es nicht mehr dynamisch und ich könnte die Wolken gleich als Hintergrundbild machen, ohne ein fitzelchen Code anzufassen. Was ich wohl auch machen werde... Oder ich pfeiff auf die Performance. Immerhin werden immernoch 100 bis 400 Fps angezeigt.
    Auf alle fälle danke ich euch!
    PUTREFACTION ////
    ◇ ALIEN BASTARDS ◇ SLY PITCH ◇ SHOVE MASTER ◇