FPS

  • Hey

    Ich habe ein Spiel mit GDI+ gemacht und eine kleine FPS-Anzeige eingebaut.

    Wenn ich das Spiel ca. 3 Mal spiele, dann das Script jeweils beende, habe ich in diesen Versuchen immer um die 50 FPS.
    Wenn ich danach - egal wie oft - das Spiel spiele und zu Testzwecken beende, läuft es immer mit 64 FPS.

    Wieso läuft es erst nach den ersten paar Versuchen mit den angestrebten 64 FPS?
    Ich kann es einfach nicht verstehen...

    Danke

  • hauke96 -> Alles beides das gleiche
    Ein Unterschied wäre vielleicht zu erwarten bei starten der Exe oder starten des Scripts (obwohl an sich sowohl als auch zur Runtime interpretiert wird).
    Bei Doppelklick / F5 startet er jedesmal den Interpreter und hängt halt als Parameter den Pfad des Quellcodes (korrigiert mich) ran.

    Allerdings kann es auch daran liegen dass du z.B. eine While ohne Sleep() hast.

    Setz doch mal in deine While ein "Sleep(10)" rein ...

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

  • Nein
    Die While mit Sleep(10) pausiert bei jedem Durchlauf 10 MS
    Und wenn eine While sonst dauerhaft durchrennt frisst das bei AutoIt Ressourcen wie bekloppt im System, die CPU Auslastung steigt damit (schaus dir mal im TaskManager an) komischerweise rasant an.
    Durch das Sleep(10) rennt es Maximal 100 mal in einer Sekunde durch und nicht n mal, sodass der Prozessor dementsprechend nicht dauerhaft bedient ist ...

    Frag da mal Andy, Marsi, Progandy oder UEZ, die 4 können dir das sicher beantworten

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

  • Ich starte das Script immer per F5.
    Aber daran dürfte es doch eigentlich nicht liegen, da ich immer so starte und die FPS trotzdem in den ersten paar Versuchen immer anders sind als in den Versuchen danach (wie gesagt: in den ersten paar Versuchen 50 FPS, danach immer 64 FPS).

    Meine While-Schleife hat ein Sleep(), und zwar While Sleep(10) <hier der Inhalt> WEnd
    Aber das würde trotzdem einen ANSTIEG von konstanten 50 auf konstante 64 FPS nicht eklären :P

    Sehr komisch...

  • Stimmt, das ist auch noch möglich.
    Oder du nimmst halt die FPS Begrenzung die @Marsi hier mal gepostet hatte, 25 FPS sind sowieso genug, wenn sie eben wie @Marsi es gemacht hat in gleichen Abständen sind.

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

  • peethebee

    Außer ein Sleep(10) in der While-Schleife, in der das Spiel läuft, habe ich keine direkte Beeinflussung der FPS.

    Daran, dass die Bilder im Cache sind, habe ich auch schon gedacht, die Idee aber wieder verworfen:
    1.) Ich kann mir nämlich nicht erklären wieso in den ersten DREI Versuchen die FPS immer niedrige 50 sind, danach aber immer 64.
    2.) Die Bilder selbst habe ich als Binärcode im Script hard coded. (Aber vielleicht landen die dann trotzdem im cache, ich kenne mich da nicht so gut aus.)

    Xorianator
    Ich habe mir genau die Begrenzung von Marsi angeschaut und auch getestet. Bei mir ruckelt das Script dann aber sehr stark. Außerdem hat eine Änderung des Parameters der Funktion keine Änderung der FPS bewirkt (Vielleicht klappt das ja bei manchen Personen, auf meinem Computer aber definitiv nicht.).

    Wie du auf 25 FPS kommst, weiß ich nicht. Beziehst du dich hierauf?: http://de.wikipedia.org/wiki/Bewegte_Bilder
    Jedenfalls läuft mein Script nur mit 60 oder mehr FPS flüssig. Selbst 50 ruckelt noch etwas.


    Vielen Dank für die Antworten. Die Diskussion kann ruhig weitergehen, ich bin für jede Hilfe offen :)

  • Nein, 25 FPS deshalb weil das menschliche Auge nicht mehr in einer Sekunde wahrnehmen kann.
    Hast du denn mal ein Script parat ?
    Vielleicht liegt es da irgendwo ...
    GDI+ oder GDI ?

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

  • Hi,
    dieses Phänomen kennt jeder, der einmal größere Scripte mit AutoIt "getimed" hat. Manchmal läuft das Script mit gleichbleibend konstanter Geschwindigkeit, manchmal wird es schneller und manchmal langsamer....
    Imho hat das aber weniger mit AutoIt zu tun, als mit dem System Windows und dessen Multitasking/Multithreading. AutoIt ist nur "empfänglicher" infolge seiner Struktur (Interpretersprache)
    Niemand ist heutzutage in der Lage, Systemevents vorherzusagen. Dort schaufelt Windows im Speicher herum, da werden irgendwelche Daten über den Bus geschoben, woanders laufen 326 Threads im Programmkontext des Users, die auch alle Zeit vom System beanspruchen. Und alle paar Millisekunden feuern noch irgendwelche Hardwareinterrupts dazwischen.....mal abgesehen vom hoch- und runtertakten jedes einzelnen Cores des Prozessors und den 8 Schlafmodi...

    Soviel zum System an sich, daran kann man nichts ändern!

    Aber wenn ich folgende Sätze lese, dann fange ich an zu zweifeln :thumbdown: :

    Zitat

    Jedenfalls läuft mein Script nur mit 60 oder mehr FPS flüssig. Selbst 50 ruckelt noch etwas.

    Wundert mich schon, da ein "normales" LCD mit 50-60Hz angesteuert wird, alles an "mehr" FPS steht als Zahl auf dem Display, definitiv ankommen am Auge tun aber nur 60 FPS.....wer da einen Unterschied "sehen" kann, der verfügt über übernatürliche Kräfte^^

    Zitat

    Vielleicht klappt das ja bei manchen Personen, auf meinem Computer aber definitiv nicht.).

    DAS liegt dann wohl definitiv am Computer, oder etwa nicht? Imho "klappen" AutoItscripte auf den ältesten Gurkenkisten genauso wie auf den neuesten Rechnern.

    Zitat

    Meine While-Schleife hat ein Sleep(), und zwar While Sleep(10) <hier der Inhalt> WEnd
    Aber das würde trotzdem einen ANSTIEG von konstanten 50 auf konstante 64 FPS nicht eklären :P

    Bei 50 FPS dauert ein Frame 20ms, abzüglich deines Sleep(10) bleiben für dein Script 10ms pro loop. Bei 64 FPS dauert der loop nur noch 5ms, wird also DOPPELT SO SCHNELL abgearbeitet!

    Daten per prefetching in den Cache zu laden kann Programme extrem beschleunigen. Per Assembler- oder C-Programm kann man bei speicherintensiven Reads/Writes schon mal den Faktor 1,5 an Speed rausholen mit EINEM Befehl! In native AutoIt funktioniert kein Cache-Management, da funkt zu viel dazwischen...allerdings kann es schon mal sein, dass die gerade benötigten Daten im Cache liegen, dann schlägt der Geschwindigkeitsboost auch bei einem AutoItprogramm zu. Im nächsten Programmdurchlauf hatte Windows die Daten im Speicher vielleicht vorher sogar auf die Platte ausgelagert...100 mal langsamer erfolgt der nächste Zugriff, noch Fragen?

    Generell MUSS man ein Script sehen, um zu beurteilen, was warum wie oder auch nicht funktioniert! Also lass sehen :D

  • Danke für die ausführliche Antwort.

    Ich möchte das Script nicht so gerne posten, es hat ca. 3000 Zeilen und ich habe daran 4 Wochen gearbeitet (und es ist noch nicht veröffentlicht). Wenn ich Code weglasse, kann es sein, dass ich FPS relevante Dinge weglasse... von daher lasse ich es besser ganz.

    Danke noch einmal für alle Antworten!