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

1

13.10.2012, 20:56

FPS-Anzeige mit der TriBase-Engine

Hallo Leute!

Ich hab heute ein wenig an Breakanoid herumgespielt und es erweiter, unter anderem neue Blöcke(Breakanoid ist das Beispiel Spiel aus dem Buch von David Scherfgen).

Jetzt bin Ich auf die Idee gekommen, die FPS oben (inGame) unter dem Levelnamen anzeigen zu lassen. Ich hab schon ein bisschen probiert, komme aber gar nicht weiter, auch im Internet und im Forum hier habe Ich nichts brauchbares gefunden :(

Jetzt meine Frage: Könnt ihr mir dabei helfen? Vielleicht durch eine Variabel, die jedes mal im Rendervorgang erhöht wird und nach einer Sekunde angezeigt und "resetet" wird? Wenn ja wie genau? Mein größtes Problem ist, was die Hauptschleife in der TriBase-Engine liegt....

MfG
Christoph

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

13.10.2012, 21:11

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

Dann die FPS mit FPS = 1 / FrameTime ausrechnen

3

13.10.2012, 21:17

Wie genau handhabe ich denn diese Funktionen, mit den Beschreibungen auf der Webseite kann ich leider nix anfangen?

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

4

13.10.2012, 21:25

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.

5

13.10.2012, 21:38

Kann mir vielleicht jemand mal einen Sourcecode dazu schreibe? Ich kriegs einfach nicht hin, und vor allem: Wie soll ich mit den LARGE_INTEGER Werten umgehen? Kann man das zu int konvertieren?

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

6

13.10.2012, 21:42

Nein, aber LARGE_INTEGER ist äquivalent zu long long.
Bei der Division musst du aber dann mit Fliesskommazahlen arbeiten.

Zeig doch mal her, was du bisher hast.

7

13.10.2012, 21:43

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LARGE_INTEGER getFrequency() {
    LARGE_INTEGER frequency;
    QueryPerformanceFrequency(&frequency);
    return frequency;
}

double getCurrentTime() {
    HANDLE currentThread = GetCurrentThread();
    DWORD_PTR previousMask = SetThreadAffinityMask(currentThread, 1);
        
    static LARGE_INTEGER frequency = getFrequency();
    
    LARGE_INTEGER time;
    QueryPerformanceCounter(&time);
        
    SetThreadAffinityMask(currentThread, previousMask);
        
    return time.QuadPart / frequency.QuadPart;
}

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

13.10.2012, 21:46

Das sollte nicht funktionieren, wegen letzter Zeile.
Weshalb du mit 1 000 000 multiplizierst, erschliesst sich mir auch nicht.

9

13.10.2012, 21:48

Die letzte Zeile war ja eig.

C-/C++-Quelltext

1
return tg::microseconds(1000000 * time.QuadPart / frequency.QuadPart)
...war zu faul um zu Nachdenken.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

10

13.10.2012, 21:51

Hä?
Ich würde sagen:
return ((double)time.QuadPart) / ((double)frequency.QuadPart)

EDIT:
Ich würde übrigens wegen Genauigkeitsproblemen erst die Dieses Frame <-> Letztes Frame Differenz bilden und erst dann in Double umwandeln und Dividieren.
Auch wenn sichs dann nicht mehr ganz so schick kapseln lässt.

Werbeanzeige