Bei Framerateeinbrüchen Geschwindigkeiten Anpassen

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

    • Bei Framerateeinbrüchen Geschwindigkeiten Anpassen

      Hallo alle zusammen!
      Bei der Planung eines neuen Projektes, ist mir die Idee gekommen dass man Framerate-Einbrüchen entgegen wirken könnte, indem man die Bewegung des Spielers anpasst, nach der Formel:

      Quellcode

      1. x += (geschwindigkeit * room_speed) / (1 + fps);

      Eine Meinungsfrage an euch: Bringt sowas etwas? Ist das sinnvoll?
      Die Idee dahinter wäre einfach, dass man sich bei- warum auch immer- einstürzender FPS immernoch gleich schnell bewegt, wenn auch weniger flüssig.
      lg Partik
    • Sowas nennt man "delta-timing".
      Wenn du dir die heutigen Spiele anschaust, funktioniert jedes von denen nach diesem Prinzip.
      Sinvoll für den Spieler: Ja, da man bei schwächeren PCs trotz der Frameeinbrüchen immernoch dieselbe Spielgeschwindichkeit hat.
      Sinnvoll für den Entwickler: Für Anfänger nicht, da dies in einigen Bereichen zu komplex werden kann.
      Ebenso wirst du z.B: auf das Alarm-Event im Game Maker verzichten müssen und dir stattdessen ein eigenes programmieren.

      Da musst du dann abwägen ob das für dich sinnvoll ist. Bei kleinen Games ist es einfacher sowas zu implementieren. Bei größeren Projekten... wäre das eigentlich sinvoll, aber dafür ist es entsprechend schwerer eiznubauen.
    • Benutz' dafür am besten Yourselfs High Resolution Timer (einfach mal googlen). Der hat ne eingebaute Delta Funktion.

      Dann erstellst du dir am besten ein persistentes Objekt names "TIMING" (o.ä., du kannst das auch über globale Variablen machen, alles dir überlassen :P).

      Ins Create Event kommt dann der Code:

      GML-Quellcode

      1. delta = 1;
      2. hrt_time_delta(); // Wird ausgeführt, damit die Delta Funktion von diesem Zeitpunkt ausgeht/zurückgesetzt wird.
      3. first = true; // Weil in der Regel im ersten Step / Create alles geladen wird, kann es hier zu fehlern kommen, deswegen wird delta beim ersten Step auf 1 gesetzt.


      Und ins Begin Step dann ganz einfach:

      GML-Quellcode

      1. var frameRate;
      2. frameRate = 60;
      3. delta = hrt_time_delta() / hrt_get_resolution() * frameRate ;
      4. if (first) { // Wie gesagt: überspringen.
      5. delta = 1;
      6. first = false;
      7. }


      So, wenn das getan is, und eine Instanz im Raum existiert, kannst du z.B. bei Bewegungen die Werte mit TIMING.delta multiplizieren.

      GML-Quellcode

      1. if (keyboard_check(vk_left)) {
      2. x -= 4 * TIMING.delta;
      3. }
      4. if (keyboard_check(vk_right)) {
      5. x += 4 * TIMING.delta;
      6. }


      edit: So wie's aussieht verwendet Verwuster ein Script zur Delta Bestimmung. Scripts sind nicht gerade schnell, wenn es ums Ausführen geht, also verwende lieber Variablen.

      - Tobi97
    • Du musst eben überall, wo Variablen inkrementiert werden überlegen: "muss dass nun unabhängig vom room_speed ablaufen oder nicht?".
      Alarme musst du, wie LEWA schon erwähnte, selbst schreiben.

      - Tobi97
    • Mal am Rande, weil hier ja schon von der Geschwindigkeit der "Skriptausführung" geredet wurde: Problematisch finde ich, dass die ganzen externen Funktionsaufrufe alle einen riesigen Overhead haben. Also würde ich mir das gut überlegen so viele externe Funktionsaufrufe in jedem Step durchzuführen, weil man so (im Game Maker) die Performance damit nur zusätzlich deutlich belastet, je nachdem eben, wie oft man einen solchen Aufruf tätigt. :rolleyes:

      Nichts gegen dieses Skript, nur ging mir das gerade durch den Kopf dabei...
    • Die neueste Studioversion hat inzwischen auch eine deltatime Variable, die die Zeit seit dem letzten Step zurückgibt. Die lässt sich dafür gut verwenden...
      Einige meiner Spiele:
    • um deinen Ansatz vom anfang nochmal aufzugreifen:
      so ist das nicht ganz richtig (von der formel her)
      im grunde ist es simpel

      GML-Quellcode

      1. x += geschwindigkeit * (fps / room_speed)

      du hast eine variable die die geschwindigkeit bei voller framezahl (bzw pro sekunde) angibt.
      dann multiplizierst di diese noch mit dem bruchteil der aktuellen tatsächlichen geschwindigkeit (fps / room_speed)
      und rechnest dann mit diesem wert weiter.

      das problem ist, dass der gamemaker die variable "fps" auf ganze stellen rundet, was die endwerte teilweise seehr seehr ungenau macht...

      Jedoch gibt es laut Interceptor...

      interceptor schrieb:

      Die neueste Studioversion hat inzwischen auch eine deltatime Variable, die die Zeit seit dem letzten Step zurückgibt. Die lässt sich dafür gut verwenden...

      ...in der neusten version eine variable für die delta zeit,
      die nicht gerundet ist, und mit der gerechnet werden kann.

      €dit: hierbei müsste selbst aus der anzahl der vergangenen steps pro sekunde eine genaue fps variable ermittelt werden.
      (folgendes geht davon aus das deltatime die in sekunden angegebene vergangene zeit seit des letzten steps ist)

      GML-Quellcode

      1. fps_exact = deltatime * room_speed
      2. -> x += geschwindigkeit * (fps_exact / room_speed)
      3. => x += geschwindigkeit * deltatime

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