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
_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
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