Entwickler-Ecke
Multimedia / Grafik - Wie kann ich FPS-Auslesen?
Stino - Fr 04.04.03 13:27
Titel: Wie kann ich FPS-Auslesen?
Hi,
gibt es eine Möglichkeit, auch ohne DelphiX die aktuellen FPS's auszulesen?
Phobeus - Fr 04.04.03 13:29
*g* Mitzählen wie oft in einer Sekunde die Bilder gezeichnet werden? Google mal ne wenig, du solltest erschlagen werden bei sowas, auf nahezu jeder größeren Seite mit Grafikprogrammierung solltest Du eine Lösung finden.
Stino - Fr 04.04.03 14:37
Titel: bps
Ich mein' ja nur ohne die Komponente DelphiX.
Hab's schon mit google probiert, finde aber nix in Delphi außer halt mit dieser Komponente, und dafür gab es schon ein Topic!
Trotzdem danke,
Carsten
Aya - Fr 04.04.03 15:52
Hi,
wie meinst du das "ohne DelphiX"..?
Benutzt du DelphiX, möchtest aber die FPS von hand berechnen oder wie?? *guckt verwirrt*
Au'revoir,
Aya~
OregonGhost - Fr 04.04.03 16:37
Einfach den Kehrwert der Zeit, die ein Frame benötigt hat, bilden und das sind dann die FPS ;c)
Wenn das Nehmen der Zeit dein Problem ist, solltest du dir GetTickCount für grobe und QueryPerformanceFrequency und QueryPerformanceCounter für feine Auflösung anschauen.
Stino - Fr 04.04.03 17:34
Nein, ich habe diese Komponente nicht installiert. Möchte sie auch eigentlich nicht installieren, und suche deshalb eine Möglichkeit die FPS ohne DelphiX auslesen zu können, also nur mit Delphi4.
Aya - Fr 04.04.03 17:38
Hi,
na ja, wie wär's wenn du uns mal verrätst was du machst..? Arbeitest du mit OpenGL, Direct3D..? Irgendne fertige Engine (GLScene etc)??
Ansonsten, im OnIdle-Event der Application.. jedesmal wenn dieses Event aufgerufen wird, hast du 1FPS mehr... also zählst du im OnIdle irgendnen Counter hoch und setzt ihn jede Sekunde 1x auf 0 zurück...
Au'revoir,
Aya~
Stino - Fr 04.04.03 22:44
Ich probiers mal so, wollte direct3d arbeiten.
thanx, Carsten
OregonGhost - Sa 05.04.03 11:54
Ich habe dir oben bereits die korrekte Methode genannt. Diese funktioniert auf jedem Win32-System. Die OnIdle-Methode würde ich nicht empfehlen, denn wenn OnIdle nicht aufgerufen wird, weil dein Programm zu beschäftigt ist, passiert da auch nichts.
Aya - Sa 05.04.03 14:05
| OregonGhost hat folgendes geschrieben: |
| denn wenn OnIdle nicht aufgerufen wird, weil dein Programm zu beschäftigt ist, passiert da auch nichts. |
Was bedeuten würde das er 0 FPS hat, was wenn das Programm komplett ausgelastet währe stimmen würde, oder? :)
Au'revoir,
Aya~
PS: Man rendert seine Scene normalerweise im OnIdle Event, egal ob OpenGL oder Direct3D
mimi - Sa 05.04.03 21:26
warum möchtes du denn die FPS selbst berechnen bring doch garnichts, weil DelphiX sowas schon kann :D
Stino - So 06.04.03 09:43
Das ist für ne Belegarbeit in der Schule. Zur Vorführung muss ich die Software aus der Schule nutzten, und die ist, Dank Dr. Kaiser-Chip das standart Delphi 4. Für private zwecke würde ich Delphix gerne nutzen.
Gibt es eigentlich auch ne Möglichkeit die Frames bei Spielen oder so zu messen? wie z.B. das Programm FRAPS. Oder funktionier das auch mit DelphiX? -> Sorry, bin aber totaler Newbie in der Hinsicht.
Danke, Carsten
OregonGhost - So 06.04.03 11:39
| Zitat: |
PS: Man rendert seine Scene normalerweise im OnIdle Event, egal ob OpenGL oder Direct3D
|
Nein. Man rendert normalerweise in der Game Loop. Ich habe noch nie ein Direct3D-Programm gesehen, wo jemand auf die Idee gekommen wäre, überhaupt in einem Event zu rendern. Und auch die meisten OpenGL-Programme tun das nicht, weil ein OnIdle-Event nicht plattformübergreifend einheitlich ist. Das heißt natürlich nicht, dass man es nicht tun kann. Üblich ist es aber nicht. Ich verweise hierzu auf den Artikel "Writing the Game Loop" von Robert Dunlop (Microsoft DirectX MVP):
| Robert Dunlop hat folgendes geschrieben: |
OnIdle : This method is intended for handling of low overhead background tasks that are not time-critical. Obviously this does not describe a game! Some of the pitfalls that prevent OnIdle from being useful to us:
- OnIdle will only be called when there are no messages available.
- Once OnIdle has been started, no more messages can be processed until OnIdle returns.
- Once OnIdle lets go of its time slice, the thread will sleep. OnIdle will not be called again until the thread has received new
messages and finished processing them
|
@Stino: Natürlich gibt es die Möglichkeit, sonst würde FRAPS es wohl nicht können ;c) Ich weiß zwar nicht, wie das geht, aber lass FRAPS doch mal durch den Dependency Walker oder TDump laufen, vielleicht bekommst du dann Aufschluss über seine Funktionsweise.
Stino - So 06.04.03 15:41
aber lass FRAPS doch mal durch den Dependency Walker oder TDump laufen, vielleicht bekommst du dann Aufschluss über seine Funktionsweise.[/quote]
Wie gesagt, bin newbie... :oops: Was ist genau der Depency Walker oder TDumb eigentlich? Hab dazu auch nichts in der Delphi-Hilfe gefunden.
Danke, Stino
mimi - So 06.04.03 16:30
sowas rendert man doch eigentlich in einem Timer mit interval 1 ;)
OregonGhost - So 06.04.03 16:36
TDump gehört zu Delphi. Wenn du dich im Delphi-Bin-Verzeichnis befindest, rufe doch einmal
tdump "d:\Programme\FRAPS\FRAPS.exe" > frapsdump.txt
auf (natürlich musst du den Pfad anpassen), und dann enthält die frapsdump.txt Informationen über die Funktionen, die FRAPS einsetzt.
@mimi: Ich hoffe, du meinst das nicht ernst ;c)
mimi - So 06.04.03 17:08
warum denn nicht...
ich habe zwar noch nie was gerendert, aber ich kann mir vorstellen es in einem DXTimer reinzuschreiben(was spricht dagegen) ?
Raphael O. - So 06.04.03 17:58
ich denke mal, dass könnte Probleme geben, insofern, dass sich das Prog aufhängt...
wenn ein Rendervorgang länger als 1ms dauert, und dann schon den nächsten anfängt hat das Prog nachkurzer Zeit viele Rendervorgänge laufen, wodurch sich die Zeit für jeden einzelnen wieder verringert->mehr angefangene Rendervorgänge usw.
sieht nicht gesund aus :D ;)
Aya - So 06.04.03 18:09
| OregonGhost hat folgendes geschrieben: |
| Zitat: |
PS: Man rendert seine Scene normalerweise im OnIdle Event, egal ob OpenGL oder Direct3D
|
Nein. Man rendert normalerweise in der Game Loop. Ich habe noch nie ein Direct3D-Programm gesehen, wo jemand auf die Idee gekommen wäre, überhaupt in einem Event zu rendern. Und auch die meisten OpenGL-Programme tun das nicht, weil ein OnIdle-Event nicht plattformübergreifend einheitlich ist. Das heißt natürlich nicht, dass man es nicht tun kann. Üblich ist es aber nicht. Ich verweise hierzu auf den Artikel "Writing the Game Loop" von Robert Dunlop (Microsoft DirectX MVP): |
Ja ok, dann ruft man halt im OnIdle die GameLoop auf ;)
und, das das ein Event ist, liegt nur daran das es in Delphi die VCL gibt...
Natürlich kann man die GameLoop auch in nem extra Thread machen, aber OnIdle ist wohl das verbreitetere (zummindest bei denen, die keine HighEnd spiele machen).
Au'revoir,
Aya~
mimi - So 06.04.03 18:42
was sind denn HighEnd Spiele ?
(kenne ich davon welche ?)
Aya - So 06.04.03 18:47
| mimi hat folgendes geschrieben: |
was sind denn HighEnd Spiele ?
(kenne ich davon welche ?) |
Damit meinte ich jetzt sowas wie Unreal 2 und so... wobei ich da Keine ahnung habe wo die ihren RenderLoop aufrufen ;)
Au'revoir,
Aya~
mimi - So 06.04.03 19:51
toll....
OregonGhost - Do 10.04.03 16:43
Da ihr mir ja ohnehin nicht glaubt, schließe ich das Thema für mich mit diesem Post ab, natürlich in dem Wissen, recht zu haben ;c)
Unter Windows hat jede Anwendung ohnehin eine Message Loop. In Spielen wird diese nur leicht umfunktioniert (besonders die VCL-Message Loop kommt schon sehr nahe ran) und wird so zur Gameloop. Die Gameloop wird in der Eintrittsfunktion des Programms aufgerufen, also in der WinMain, oder in einer Unterfunktion, jedoch nicht in einem Ereignis. Ein Ereignis kann ohne die Message- bzw. Gameloop nämlich gar nicht auftreten.
Als Delphianer kann man sie auch alternativ in das Programm in den begin-end-Block schreiben, kommt auf's selbe raus. Weder OnIdle noch Timer (inklusive DXTimer, diese sind vielleicht für Multimedia-Anwendungen geeignet, aber nicht für Spiele) werden häufig in Spielen verwendet. Das schließt nicht nur professionelle Spiele wie Unreal II ein, sondern auch viele Hobby-Spiele. Dass viele Hobby-Spiele aber eben auch Timer und OnIdle verwenden, ist genau ein Fehler der Hobby-Programmierer und nicht einer der Professionellen. Fehler zumindest in soweit, als dass es der falsche Weg ist, wenn man den Sinn sowohl von OnIdle als auch von Timern betrachtet. Dazu verweise ich auch nochmals auf Robert Dunlops Artikel.
Aus verschiedenen Gründen kommt die Gameloop normalerweise auch nicht in einen anderen Thread, aber das hängt natürlich mit der Architektur sowohl der Gameloop als auch der API zusammen.
Aya - Do 10.04.03 16:49
huhu,
| Zitat: |
| Ein Ereignis kann ohne die Message- bzw. Gameloop nämlich gar nicht auftreten. |
das ergeiniss OnIdle der VCL wird doch im MessageLoop aufgerufen... Wenn du etwas in den OnIdle Event schreibst, ist das gleichbedeutend damit wie wenn du es in die MessageLoop reinschreibst ;)
und, ob ich nun den OnIdle Event nehme, oder zwischen Begin/End schreibe ist exakt dasselbe... denn der OnIdle Event wird zwischen Begin/End aufgerufen ;)
Au'revoir,
Aya~
OregonGhost - Do 10.04.03 17:08
Nochmal zum Mitschreiben: OnIdle wird aufgerufen, wenn die Anwendung gerade nichts zu tun UND wenn Windows meint, dass es keine anderen Anwendungen gibt, die was zu tun haben. Es wird nicht unbedingt ständig aufgerufen, und es gleichzusetzen mit dem begin-end ist Schwachsinn. Zitat aus der Delphi-Hilfe:
| Zitat: |
Auf Basis von OnIdle können Sie eine Ereignisbehandlungsroutine programmieren, mit der Sie bestimmte Aktionen auslösen können, wenn sich die Anwendung im Leerlauf befindet. Eine Anwendung befindet sich beispielsweise im Leerlauf, wenn eine Benutzereingabe erwartet wird.
[...]
OnIdle wird nur einmal aufgerufen, wenn die Anwendung in den Leerlauf übergeht. Das Ereignis wird nur dann fortlaufend ausgelöst, wenn Done auf False gesetzt wird. Das bedeutet, daß diese Anwendung übermäßig viel CPU-Zeit beansprucht, was die Leistung des gesamten Systems beeinträchtigt. |
Ich will dir damit deine OnIdle-Benutzung ja nicht schlecht machen, aber es ist einfach der falsche Weg, und der andere Weg ist nur minimal umständlicher, dafür aber wesentlich flexibler und leistungsfähiger.
Aya - Do 10.04.03 17:20
| OregonGhost hat folgendes geschrieben: |
| Nochmal zum Mitschreiben: OnIdle wird aufgerufen, wenn die Anwendung gerade nichts zu tun UND wenn Windows meint, dass es keine anderen Anwendungen gibt, die was zu tun haben. |
OnIdle wird aufgerufen wenn die eigene Anwendung nichts zu tun hat, ja.. aber es hat nichts damit zu tun ob ne andere Anwendung was macht.
Au'revoir,
Aya~
mimi - Do 10.04.03 21:22
wie gesagt ich würde es in einem Timer oder in einem Thred(oder wie das heißt) machen;)
CastleArts - Sa 19.04.03 16:55
Ist das Einfachste nicht die simple TimeGetTime Methode?
Sie gibt die Zeit in Millisekunden an, wie lang Windows schon läuft.
Ich glaub sie ist in der Unit mmsystem enthalten...(einfach mal die Hilfe zu TimeGetTime über F1 suchen).
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var time : integer; RenderingTime : integer; fps : real;
begin time := TimeGetTime; //Deine Berechnungen... RenderingTime := TimeGetTime - time; //Gibt die benötige Zeit in Millisekunden zurück fps := 1000 / RenderingTime; //der Kehrwert entsprich dann also den fps end; |
MfG,
Magnus Schlösser
mimi - Sa 19.04.03 17:53
er will doch nicht wissen wie lange Windows schon läuft ;)
sondern er will die FPS berechnent haben
CastleArts - Mo 21.04.03 01:28
Äh die Windowslaufzeit ist doch nur Mittel zum Zweck, die absolute Zeit spielt nämlich gar keine Rolle.
Nochmals im Detail:
1. Die Zeit wird geholt und in einer Variablen gespeichert.
2. Danach wird der Bildaufbau etc. berechnet.
3. Die Zeit wird wiederrum genommen und die Differenz ergibt die Rechenzeit für den Bildaufbau in Millisekunden.
4. Der Kehrwert der Rechenzeit (1 / t) ergibt dann die Bilder pro Millisekunde
5. Das Ganze mal Tausend und schupp-die-wupp hat man die FPS! (frames per second)
Die meisten meiner "Delphi-Kollegen verwenden die Methode"!!!
MFG, Magnus
P.S. Verstanden Mimi?? :wink:
mimi - Mo 21.04.03 15:40
Naja, wenn es funktioniert ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!