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]

    _Main()

    [/autoit] [autoit][/autoit] [autoit]

    Func _Main()

    [/autoit] [autoit][/autoit] [autoit]

    Local $FPS, $Timer = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    While _FPS(25)

    [/autoit] [autoit][/autoit] [autoit]

    ; Zeitaufwändige Rechnung...

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(Random(0, 4, 1) * 10) ; Zufällig 10, 20, 30 oder 40 ms warten

    [/autoit] [autoit][/autoit] [autoit]

    ; Zeitaufwendige Rechnung...

    [/autoit] [autoit][/autoit] [autoit]

    $FPS += 1
    If TimerDiff($Timer) >= 1000 Then
    ConsoleWrite($FPS & @CRLF)
    $FPS = 0
    $Timer = TimerInit()
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Main

    [/autoit] [autoit][/autoit] [autoit]

    Func _FPS($W) ; Versucht eine Schleife immer mit den gewünschten FPS durchlaufen zu lassen.
    Local Static $_t = TimerInit(), $f
    Local $s = TimerDiff($_t)
    $f += (1000 / $W - $s)
    $f = (-$f) * ($f < 0) + $f
    Sleep(Int($f / 10) * 10)
    $f -= Int($f / 10) * 10
    $_t = TimerInit()
    Return True
    EndFunc ;==>_FPS

    [/autoit]
  • Ich verstehe es immer noch nicht ...
    Warum sleept es eine Random Time (bis zu 40 MS) und dann soll es geregelt sein ...
    Ich glaube das musst du mal erklären (ich versteh das wirklich nicht :( )

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Hi,

    Zitat

    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.

  • Haha bei Minecraft sind 25 FPS innerhalb von 100ms, die restlichen 900 ms bleiben als ein Bild :rofl:

    Aber danke, habs verstanden :)
    Immerhin demzufolge eine Drossellung / Einstellung die es schafft es konstant zu verteilen, net so wie Beispiel Minecraft einmal schnell und einmal nichts :)

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Hi,

    Zitat

    Haha bei Minecraft sind 25 FPS innerhalb von 100ms, die restlichen 900 ms bleiben als ein Bild

    genau so sollte man es nicht machen....

  • minx nicht wirklich ...
    In 100 MS laufen 25 verschiedene Bilder ab, und die restlichen 900 Sekunden stehen als ein Bild.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Was hat dich denn dazu veranlasst zu glauben, dass ich das nicht verstanden habe. "mindf*ck" deswegen, da dies eine sehr, nun ja, unkonventionelle Weise ist, die FPS zu begrenzen. :D