FPS einstellen

      FPS einstellen

      Moin,

      Wir kennen ja alle den "Nanosleep" unzwischen in 100ns schritten per DelayExecution oder WaitableTimer.
      Dafür wird in jedem Fall ein DllCall benötigt.

      Problem ist natürlich das Sleep, was nur in 10er Schritten funktioniert.
      Man kann ihm aber auch sagen: Schlafe 10ms und beim nächsten Mal 5ms mehr. (also die Wahrtezeit aufschieben und in 10er Schritten abarbeiten).

      So lässt sich fast ohne Ruckeln (in MicroTD getestet) eine ordentliche steuerung für die Framerate hinbiegen.
      (Das kann man natürlich auch per Nanosleep machen. Und das habe ich auch vorher so gemacht, aber Bordmittel sind cooler :P)

      Ob diese Methode auf jedem System funktioniert weiß ich nicht. Die Framerate wird im Regelfall so lange aufrecht erhalten, bis die Schleife zu viel Zeit benötigt.

      als kleines Beispiel ein Beispiel:
      Spoiler anzeigen

      AutoIt-Quellcode

      1. _Main()
      2. Func _Main()
      3. Local $FPS, $Timer = TimerInit()
      4. While _FPS(25)
      5. ; Zeitaufwändige Rechnung...
      6. Sleep(Random(0, 4, 1) * 10) ; Zufällig 10, 20, 30 oder 40 ms warten
      7. ; Zeitaufwendige Rechnung...
      8. $FPS += 1
      9. If TimerDiff($Timer) >= 1000 Then
      10. ConsoleWrite($FPS & @CRLF)
      11. $FPS = 0
      12. $Timer = TimerInit()
      13. EndIf
      14. WEnd
      15. EndFunc ;==>_Main
      16. Func _FPS($W) ; Versucht eine Schleife immer mit den gewünschten FPS durchlaufen zu lassen.
      17. Local Static $_t = TimerInit(), $f
      18. Local $s = TimerDiff($_t)
      19. $f += (1000 / $W - $s)
      20. $f = (-$f) * ($f < 0) + $f
      21. Sleep(Int($f / 10) * 10)
      22. $f -= Int($f / 10) * 10
      23. $_t = TimerInit()
      24. Return True
      25. EndFunc ;==>_FPS
      Hi,
      Ich verstehe es immer noch nicht ...

      In einer Schleife laufen diverse Berechnungen, logischerweise auf einem schnellen Rechner schneller als auf einem Langsamen
      Damit sowohl auf dem schnellen Rechner als auch auf dem langsamen Rechner die Berechnungen IMMER IN GLEICHER Geschwindigkeit ablaufen, muss man sich auf eine Mindestgeschwindigkeit einigen, die auf ALLEN Rechnern gleich sein soll.
      Dadurch läuft die Berechnung auf allen Rechnern in der gleichen Geschwindigkeit. Soweit klar?
      In Spielen spricht man von FPS (Frames Per Second) und durch die Trägheit des menschlichen Auges empfindet man ab 25 FPS eine ruckelfreie Bewegung.
      Damit Marsi´s Spiel auf allen Rechnern identisch schnell und flüssig läuft, will er die Framerate auf 25FPS festlegen, und realisiert das mit deiner "dynamischen" Sleepfunktion.
      ciao
      Andy


      "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
      "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

      Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt
      Hi,
      Haha bei Minecraft sind 25 FPS innerhalb von 100ms, die restlichen 900 ms bleiben als ein Bild
      genau so sollte man es nicht machen....
      ciao
      Andy


      "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
      "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

      Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt
    autoit.de Webutation