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

24.12.2009, 11:23

Frage zum Timimg

Ich arbeite mit dem PerformanceCounter und habe folgendes Problem:

Ich möchte in jedem Frame die vergangene Zeit in Sekunden errechnen,
das mache ich in dem ich den aktuellen LastCount ( LastCount ) von dem aktuellen Zählerstand ( CurrentCount ) abziehe und das Ergebnis durch die Frequenz des PerformanceCounters Teile das funktioniert auch.

aber wenn jetzt zum Beispiel einer der Werte im Minusbereich liegt, da der DatenTyp ja LONGLONG ist passiert das ja irgendwann, bekomme ich eine vergangene Zeit im Minusbereich da ich aber die Bewegungen davon abhängig mache ist das unpraktisch wie kann ich das Problem lösen ?

Das ist die Funktion zum Errechnen der vergangenen Zeit:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
VOID MBE_Timer :: Update ( VOID )
{
    this -> LastCount = this -> CurrentCount;
    QueryPerformanceCounter ( reinterpret_cast < LARGE_INTEGER * > ( & this -> CurrentCount ) ); 

    this -> FrameTime = static_cast < FLOAT > ( ( this -> CurrentCount - this -> LastCount ) / this -> Frequency );

    return;
}

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

24.12.2009, 12:19

ich hab noch nie was davon gehört, dass der timer negativ wird.

sollte das problem irgentwann mal auftreten kannst du den wert absolut machen.

C-/C++-Quelltext

1
2
if(FrameTime < 0)
FrameTime *= -1;
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

24.12.2009, 12:36

naja der PerformanceCounter erhöht den Zähler ja immer weiter aber der DatenType ist LONLONG das heist irgend wann gehts im Minusbereich
wieder los.

Das ist wie mit einem SHORT wert denn man versucht mit 400000 zu inizialisieren.

Stazer

Alter Hase

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

4

24.12.2009, 13:36

LONGLONG?
ist doch long oder?
dann nimmst du einfach unsigned long

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

5

24.12.2009, 13:41

LONGLONG = int mit 64bit... das heißt der positive bereich geht von:
0-9223372036854775807

Angenommen die Frequenz des Zählers wäre bei 1µs (das ist ein übertrieben genauer Wert!!!! = 0.001 ms ) = 0.000001 s
Damit würde der Zähler nach
9223372036854775807 * 0.000001 s = ~9223372036854,8 s = ~153722867280,9 min = ~2562047788,0 h = ~106751991,2 Tage = etwa 291672 JAHRE
bei einem negativen Wert anfangen.....

Noch Fragen? :lol:

6

24.12.2009, 15:04

Ich habe mit dem Debugger aber die Werte überprüft und ich habe abundzu mal einen Minuswert bekommen.

7

24.12.2009, 15:06

Zitat

Ich habe mit dem Debugger aber die Werte überprüft und ich habe abundzu mal einen Minuswert bekommen.

-> Dann wirst du wohl irgendeinen Fehler in der Berechnung, oder bei QueryPerformanceCounter (...) haben ;)

Was gibt die Funktion denn zurück ?

Stimmt denn der Wert der Frequenz ?

8

24.12.2009, 15:18

Die Funktion gibt ein FLOAT-Wert zurück der für die vergangene Zeit in sec steht.
ich habe sie im ersten Beitrag mit dargestellt.

9

24.12.2009, 15:29

Zitat

Die Funktion gibt ein FLOAT-Wert zurück der für die vergangene Zeit in sec steht.

;) Ich meinte QueryPerformanceCounter

zeig mal die Stelle, wo du die Frequenz abfragst ?

10

24.12.2009, 15:37

Mit dieser Funktion Frage ich das ab.
Die Klasse MBE_Timer enthält dann die Member LastCount, CurrentCount, Frequency vom Type LONGLONG und noch einen Memner FrameTime vom Type FLOAT.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
BOOL MBE_Timer :: Create ( VOID )
{
    if ( ! QueryPerformanceFrequency ( reinterpret_cast < LARGE_INTEGER * > ( & this -> Frequency ) ) )
    {
        return FALSE;
    }

    return TRUE;
}

Werbeanzeige