Frames per Second richtig messen (Verständnisproblem)

  • Hi @all,

    ich würde gerne in meinem Script die FPS ermitteln. Bei einer DO-Schleife, wo bei jedem Durchlauf nur ein Teil auf dem Screen irgendwo gemacht wird, ist ja einfach.
    Das habe ich mir bei der Firework Demo von UEZ angeschaut. Was aber wenn ich einige Funktionen, welche ebenfalls Dinge in der GUI ändern, aus der Haupt-DO-Schleife
    herausgenommen habe und jetzt durch AdLibRegister (=ALR) aufrufe?

    OK, bei jedem ALR Aufruf pausiert mein Script (meine DO-Schleife), aber es kann ja vorkommen, das ALR 2-3 mal öfters aufgerufen wird, als meine DO-Schleife für einen Durchlauf braucht...
    Erhöhe ich also den FPS Zähler immer nur am Ende meiner DO-Schleife oder auch nach Durchlauf jeder ALR Funktion?
    Ich versuche das mal in einem Beispiel Code darzustellen (der Code funktioniert so natürlich nicht, es soll es nur veranschaulichen): :Glaskugel:

    Nachtrag:

    Ich habe mal gemessen und zwar in meiner alten Routine (ohne ALR) und komme dort auf einen Durchschnitt von 32 FPS. Denselben Wert erreiche ich in der neuen
    Routine, wo ich 3 Funktionsaufrufe aus der Haupt-DO-Schleife entfernt habe auch. Wenn ich allerdings wie oben im Beispiel innerhalb jeder Funktion, welche durch
    das ALR angetriggert wird, ebenfalls den FPS Counter erhöhe, komme ich auf einen Durchschnittswert von 123 FPS.

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

    3 Mal editiert, zuletzt von Cape-City (13. Dezember 2016 um 10:42)

  • OK, bei jedem ALR Aufruf pausiert mein Script (meine DO-Schleife), aber es kann ja vorkommen, das ALR 2-3 mal öfters aufgerufen wird, als meine DO-Schleife für einen Durchlauf braucht...

    Dann läuft mit deinem Konzept gewaltig etwas schief!
    Ich nutze die AdlibRegister()-Funktion ausschliesslich, um die FPS ANZUZEIGEN! Das ist innerhalb der Funktion dann maximal ein Ein- bis Dreizeiler. "Pausieren" tut da mal garnichts!

    Nach deinem obigen Script ist es sowieso schon fraglich, ob und wieso die korrekte Anzahl FPS angezeigt werden soll?!
    Wenn du mit mehreren Adlib-Funktionen arbeitest, wird irgendwann der Fall eintreten, dass der Adlib-Timer deine Funktionen "stört".
    Wobei du den FPS bei mehrern Timern nicht brauchst, da sowieso logischerweise nur der "langsamste" Timer gezählt wird!

  • Ich nutze die AdlibRegister()-Funktion ausschliesslich, um die FPS ANZUZEIGEN! Das ist innerhalb der Funktion dann maximal ein Ein- bis Dreizeiler. "Pausieren" tut da mal garnichts!


    Das bei einem AdLib Aufruf das Script pausiert, habe ich aus der AutoIt Hilfe:

    [...]The adlib function should be kept simple as it is executed often and during this time the main script is paused[...]

    Hmmmm, vielleicht habe ich auch falsch gefragt und wir stellen es jetzt mal ausser Frage oder Sinnhaftigkeit, warum ich verschiedene Funktionen im AdLib registriere.

    (Die AdLib Funktion ist halt ähnlich der früher beim Assembler programmieren. Ich hatte mein Hauptscript und habe einzelne Subroutinen (Font-Slider/Scroller, etc) einfach an einen "Interrupt gehangen". So wurden diese kontinuierlich ausgeführt und brauchten im Hauptscript nicht immer wieder berücksichtig werden.)

    Jede Funktion nimmt unterschiedliche Änderungen an der GUI vor und diese möchte ich erfassen, weil in der Summe ja X Änderungen (Frames) pro Sekunde vorgenommen wurden. Es kann aber auch sein, das ich einem völlig falschen Pferd aufsitze und ein grundsätzliches Verständnisproblem habe.

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

    • Offizieller Beitrag

    Ihr wißt sicher, dass Grafik nicht meine Hauptkompetenz ist. Aber vom schnöden Verständnis her, ist die Ermittlung der FramesPerSecond doch:
    - Zähle, wie oft meine Oberfläche pro Sekunde neu gezeichnet wird.
    Nun, da Windows uns mit einer Paint-Message beglückt nach jedem Neuzeichnen, würde ich diese Message registrieren und Auswerten.

  • Ich denke, das Problem ist, dass Cape-City mehrere Dinge nacheinander auf das Fenster malt (vermutlich mit Adlibregister). Wenn alles fertiggemalt ist, ist das für ihn ein Frame, und die möchte er zählen.
    Unbeachtet dessen, dass Windows das Fenster dabei mehrmals neu zeichnet.
    Um das zu unterbinden würde ich auf eine Hintergrundfläche Zeichnen und diese mit den gewollten (maximalen) FPS mit der, die im Vordergrund ist, wechseln. Mit der oft bei 2D anwendungen verwendeten Technik entfällt das neuzeichnen der Gui bei jedem Befehl (auf dem Graphics Objekt des Fensters). Stattdessen wir auf ein Hintergrundbild gemalt und dann nur einmal das Bild auf die GUI gezeichnet.

  • Danke für die Antworten!

    Ich bin nochmal in mich gegangen und eine Idee welche ich habe, nicht von Frames Per Second zu sprechen, sondern ich schaue einfach wieviel Cycles jede Schleife pro Sekunde schafft,
    also CPS :party: . Das ist dann soweit OK für mich und gibt auch Sinnvolle Ergebnisse hervor.

    Ich denke wir werden hier auch keinen gemeinsamen Kontext finden, da meine Vorgehensweise innerhalb des Scriptes und der wie man es machen sollte oder anders könnte und was FPS im Grunde bedeutet, eh nicht zusammen passen :Face: .

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

  • und was FPS im Grunde bedeutet,

    Was heißt "im Grunde"?
    FPS sind FPS. Also irgendwie im Script erzeugte Bilddarstellungen pro Sekunde. Und da gibts auch nichts an der "Bedeutung" auszulegen!
    Bilder zählen, Zeit festlegen, FPS als Bilder pro Zeit ermitteln. Fertig!
    Die Bilder zählen erfolgt mit einer simplen Variable, die Zeit wird über einen (EINEN!) wieauchimmerimplementierten Timer festgestellt. Sobald mehrere Timer/Zähler involviert sind, die auch noch voneinander abhängen, ist das Ergebnis nicht mehr einfach nachzuvollziehen.
    So lange du sicherstellen kannst, dass deine Zeitmessung funktioniert, stimmen zwangsläufig auch die FPS!

  • Was heißt "im Grunde"?FPS sind FPS. Also irgendwie im Script erzeugte Bilddarstellungen pro Sekunde. Und da gibts auch nichts an der "Bedeutung" auszulegen!
    Bilder zählen, Zeit festlegen, FPS als Bilder pro Zeit ermitteln. Fertig!
    Die Bilder zählen erfolgt mit einer simplen Variable, die Zeit wird über einen (EINEN!) wieauchimmerimplementierten Timer festgestellt. Sobald mehrere Timer/Zähler involviert sind, die auch noch voneinander abhängen, ist das Ergebnis nicht mehr einfach nachzuvollziehen.
    So lange du sicherstellen kannst, dass deine Zeitmessung funktioniert, stimmen zwangsläufig auch die FPS!

    Genau das habe ich damit gemeint und nichts anderes geschrieben! Du hast aus meiner Aussage, einen Teil herausgenommen und damit aus dem Kontext gerissen. Wenn es so alleine steht, ist es richtig, das es dazu nichts an der "Bedeutung" auszulegen gibt, aber die "Bedeutung" von FPS und wie man es ermittelt, passt nicht mit meiner Vorgehensweise im Script zusammen.
    @Kanashius hat das schon richtig erkannt, wo mein "Fehler" liegt.

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2