Schnelle Schleifen - wie machen?

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

    • Schnelle Schleifen - wie machen?

      In meinem aktuellen Projekt habe ich große Schleifen um die Spielwelt zu generieren. Nur geht mir das immnernoch zu langsam. WIe kann man das beschleunigen? Was ist am schnellsten - for, while, repeat oder do?
      Und könnte es was bringen wenn ich die Gmthreads DLL zu Hilfe ziehe: gmc.yoyogames.com/index.php?showtopic=390517
      Den Loop in einem eigenen Thread ausführen lasse mit einer sehr hohen Priorität. Oder gibt es vielleicht sogar eine DLL extra für schnellere Loops?
      Vielleicht sind loops in einer anderen Programmiersprache schneller als in C++ (GMS ist doch mit gemacht worden oder? weiß das jetzt nicht zu 100%), dann könnte man doch eine DLL dafür mit dieser machen oder?

      Ich denke dieses Thema hat schon EInige GMler beschäftigt.
    • Bei den Ausführungsgeschwindigkeiten gibt es keine großen Unterschiede zwischen den verschiedenen Schleifentypen. Und die Programmiersprache spielt ebenfalls keine große Rolle, bei der Geschwindigkeit der Schleife, da diese eigentlich optimiert werden sollten. Es gibt aber sehr wohl einen Unterschied beim Yoyo Compiler und man muss darauf achten, dass man diesen benutzt, wenn man hohe Geschwindigkeiten haben möchte. Dieser wandelt einfach den GML Code in C++ Code um und dieser wird dann von VS in Maschienencode umgewandelt.
      Also im Klartext heißt es: Nein es geht so nicht schneller. Viel wichtiger ist der Inhalt im Schleifenkörper, da diese überhaupt die Last ausmachen. Unter anderem sollte man so wenige Funktionen wie möglich verwenden, und wenn möglich in mathematische Ausdrücke umwandeln. Diese kann VS besser optimieren. (Z.B anstatt sqr(x) zu x*x) Sowie gleiche Berechnungen vermeiden und vor der Schleife berechnen.

      GML-Quellcode

      1. for(var i = 0; i <= 1000; i++)
      2. {
      3. test[i] = sqrt(a)*i;
      4. }
      wird zu

      GML-Quellcode

      1. var sqrt_a = sqrt(a);
      2. for(var i = 0; i <= 1000; i++)
      3. {
      4. test[i] = sqrt_a*i;
      5. }

      Es gibt noch einige Methoden um seine Schleife zu optimieren. In deinem Fall würde ich auch die Schleife über mehrere Steps hinweg durchführen. Dies bewirkt wahre Wunder, ist aber auch aufwendiger zu programmieren.

    • In meinem Fall jetzt:

      Wäre

      GML-Quellcode

      1. for(i=width; i>0; i--)
      2. {
      3. for(ii=height; ii>0; ii--)
      4. {
      5. for(iii=depth; iii>0; iii--)
      6. {
      7. grid[# i,ii] = iii
      8. }
      9. }
      10. }


      schneller als

      GML-Quellcode

      1. for(i=0; i<width; i++)
      2. {
      3. for(ii=0; ii<height; ii++)
      4. {
      5. for(iii=0; iii<depth; iii++)
      6. {
      7. ds_grid_add(grid, i,ii, iii);
      8. }
      9. }
      10. }


      edit: Und wie sieht es mit dieser Threading DLL aus? Har die schon mal jemand ausprobiert? Kann ich das Ganze dadurch schneller machen?

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

    • was ist denn in der Schleife? Oder ist da nichts? :D

      Edit: @Chris987
      man kann es noch besser optimieren. Schleife Rückwärts laufen lassen. Ist schneller beim Variablen initialisieren ;)
      Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
      Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

      Willst du mit mir auf Discord Chatten/Quatschen?
      Meine Husi's Tutorial Reihe
    • Dein Problem ist vermutlich, das die Arbeit in den Schleifen so umfangreich ist, dass sie nicht in einen Step "passt" (zeitlich gesehen), von daher also das Spiel einfriert. Um dem zu entgehen musst du die Arbeit irgendwie intelligent aufteilen, oder du lässt immer mal wieder in der Schleife den Bildschirm manuell malen. Insgesamt dauert es dann zwar noch minimal länger, allerdings ist dann wenigstens wieder bewegung im Spiel.
      132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel: