Du bist nicht angemeldet.

Kontrollzentrum

Spenden

Jeder Euro hilft uns, euch zu helfen.

Adsense

Downloads

Stabil: 3.3.8.1 (Q, H)
Stabil: 3.3.12.0 (Q, H)
Beta: 3.3.11.5 (Q, H)
SciTE: 4/5/2014 (Q, H)
Hilfe Deutsch: 12/23/2013 (Q)
Download: OrganizeIncludes (Q)
Stand: 02.06.2014 - 2:21 Uhr

Lieber Besucher, herzlich willkommen bei: AutoIt.de - Das deutsche AutoIt-Forum. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

Marsi

Snickers hat Nüsse

  • »Marsi« ist der Autor dieses Themas

Registrierungsdatum: 14. Februar 2010

  • Private Nachricht senden

1

Mittwoch, 25. April 2012, 20:37

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 Spoiler

AutoIt-Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
_Main()

Func _Main()

    Local $FPS, $Timer = TimerInit()

    While _FPS(25)

        ; Zeitaufwändige Rechnung...

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

        ; Zeitaufwendige Rechnung...

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

    WEnd

EndFunc   ;==>_Main

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

Meine Skripte können nix, aber ich preise sie dennoch als Wunderwerke an !

Registrierungsdatum: 20. Februar 2010

Wohnort: Teltow, Berlin

Beruf: Schüler

  • Private Nachricht senden

2

Mittwoch, 25. April 2012, 21:08

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 :( )

Andy

Märchenonkel

Registrierungsdatum: 3. Dezember 2008

Beruf: Selbstausbeuter :o)

  • Private Nachricht senden

3

Mittwoch, 25. April 2012, 21:25

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

Registrierungsdatum: 20. Februar 2010

Wohnort: Teltow, Berlin

Beruf: Schüler

  • Private Nachricht senden

4

Mittwoch, 25. April 2012, 21:58

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 :)

Andy

Märchenonkel

Registrierungsdatum: 3. Dezember 2008

Beruf: Selbstausbeuter :o)

  • Private Nachricht senden

5

Freitag, 27. April 2012, 06:51

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

minx

...der etwas andere

Registrierungsdatum: 22. April 2012

Beruf: xkcd Autor

  • Private Nachricht senden

6

Freitag, 27. April 2012, 19:58

Zitat

Haha bei Minecraft sind 25 FPS innerhalb von 100ms, die restlichen 900 ms bleiben als ein Bild
:huh: mindf*ck

Registrierungsdatum: 20. Februar 2010

Wohnort: Teltow, Berlin

Beruf: Schüler

  • Private Nachricht senden

7

Freitag, 27. April 2012, 20:03

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

minx

...der etwas andere

Registrierungsdatum: 22. April 2012

Beruf: xkcd Autor

  • Private Nachricht senden

8

Freitag, 27. April 2012, 20:06

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

Blume

User

Registrierungsdatum: 8. Mai 2009

Wohnort: Merken

Beruf: Fachinformatiker für Systemintegration

  • Private Nachricht senden

9

Samstag, 28. April 2012, 10:22

Hey,

Geile Idee Marsi, funktioniert bestens bei mir.

mfg.
Blümli ^^
mfg, Blume
Ich bin wirklich stolz, das Ich schon 5 Jahre, 81 Tage hier bin :)

autoit.de Webutation