Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

21

13.10.2012, 22:13

Ich frage mich, weshalb ich überhaupt hier Beiträge schreibe, wenn sie dann nicht gelesen oder beachtet werden.

Zitat

Die Methode "QueryPerformanceFrequency" liefert dir im Parameter zurück, mit welcher Frequenz der Timer arbeitet.
Kommt zb. 1 000 000 zurück, heißt das, dass der Timer in einer Sekunde um 1 000 000 hochzählt.

Mit der zweiten Methode "QueryPerformanceCounter" kannst du dir denn aktuellen Timerwert zurückliefern lassen.

Also jedes Frame einmal den "QueryPerformanceCounter"-Wert abfragen und speichern.
Im nächsten Frame die Differenz zum aktuellen Wert ausrechnen und entsprechend durch die Frequenz teilen.

Zitat

Dauer zwischen den Frames messen. (zb. mit QueryPerformaceCounter - Einfach Googeln oder hier und hier schauen.)

Dann die FPS mit FPS = 1 / FrameTime ausrechnen

22

13.10.2012, 22:16

@Spiele Programmierer: Ich habe es gerade nochmal getestet: Es läuft flüssig, wenn ich die vergangene Zeit mit der Bewegungsgeschwindigkeit nehme und SFML benutzt das selbe (kein FPS-Limit an).

Edit: Link

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

23

13.10.2012, 22:20

Ja der Code mag funktionieren. Wegen der Multiplikation die Vorang gegenüber der Division hat.
Aber garantiert nicht das, was du hier geschrieben hast.

24

13.10.2012, 22:21

Ich bitte um Entschuldigung.

25

13.10.2012, 22:21

Sorry, Ich war mehr auf den fertigen Code fokussiert :D

Das von Ihnen verstehe Ich aber auch nicht ganz, Ich muss also in jedem Frame den COunter-Wert speichern und im nächsten die Differenz ausrechnen und dann die Variabel FPS = 1/Die übrig gebliebene Zeit initialisieren?
SO vielleicht?:

QueryPerformanceCounter(CounterB);
CounterC = QueryPerfomanceCounter(CounterA)-CounterB;
QueryPerformanceCounter(CounterA);

FPS = 1 / CounterC

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

26

13.10.2012, 22:30

Ich benutzte jetzt der Übersichtlichkeit und Einfachheit wegen jetzt mal Delops Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//Auf Klassenebene:
double LastTime; //Muss initialisiert werden

//In deiner Funktion
double NowTime = getCurrentTime();
double FrameTime = NowTime -  LastTime;
LastTime = NowTime;
double FPS = 1.0 / FrameTime;

27

13.10.2012, 22:41

Erstmal Danke für die Hilfe!
Also Ich hab das jetzt alles gemacht, aber Ich bekomme als FPS ca. -2.000.000.000 raus, und das ist sogar für meinen PC recht wenig :D
Ich hab allerdings die FPS-Variabel in int umgewandelt, da ich sonst mit der Text-Schreib-Funktion Probleme bekomme, aber SOLCHE Ungenauigkeiten dürften doch dabei nicht enstehen, oder?

LG
Christoph

28

13.10.2012, 22:43

Zeig bitte mehr Code.
Übrigens: Hier spricht man sich mit du an.

29

13.10.2012, 22:53

Ok, dann per Du, ich bin hier recht neu im Forum,deshalb war ich mir unsicher, wie man sich hier nennt, aber wollte halt net unhöflich sein :D


Also hier Die Variabel in der Klasse CGame:
double LastTime;

Und hier der in der Render-Funktion der Klasse CGame:

C-/C++-Quelltext

1
2
3
4
5
    //FramesPErSecond berechnen
    double NowTime = getCurrentTime();
    double FrameTime = NowTime -  LastTime;
    LastTime = NowTime;
    int FPS = 1.0 / (int)FrameTime;


Und hier die Malfunktion in der Renderfunktion der Klasse CGame:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
         // Anzeigen rendern
    g_pBreakanoid->m_pFont2->Begin();

    // FPS
    sprintf(acText, "FramesPerSecond: %d", FPS);
    g_pBreakanoid->m_pFont2->DrawText(tbVector2(0.05f, 0.1f), acText,
                                      TB_FF_RELATIVE | TB_FF_RELATIVESCALING, -1,
                                      tbColor(1.0f, 1.0f, 1.0f), tbColor(1.0f, 0.25f, 0.25f));

        // Restliches, Levelnummer etc....

    g_pBreakanoid->m_pFont2->End();

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

30

13.10.2012, 22:57

FrameTime ist eine Fließkommavariable die einen relativ kleinen Wert beinhaltet. Wenn du in Int umwandelst sind die Nachkommastellen weg und Zack hast du eine Nulldivision.

int FPS = (int)(1.0 / FrameTime);

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (13.10.2012, 23:02)


Werbeanzeige