Czy istnieje licznik czasu jeszcze lepszej precyzji od funkcji clock();
bo ten liczy sekundę jako 1000 jednostek a chciałbym np. w milionach 1 000 000. Poniższy kod jest z ksiązki opengl programowanie opengl jak to wyeksportować:
/****************************************************************************
HiResTimer.h
Klasa obudowuj╣ca licznik czasu wysokiej rozdzielczoťci.
Nie mo┐e byŠ u┐ywana, jeťli licznik taki nie jest dostŕpny.
Autor : Dave Astle
Data : 2/1/2001
Opracowano dla potrzeb ksi╣┐ki "Programowanie gier w OpenGL"
*****************************************************************************/
#ifndef __TIMER_H_INCLUDED__
#define __TIMER_H_INCLUDED__
#include <windows.h>
class CHiResTimer
{
public:
CHiResTimer() {}
~CHiResTimer() {}
/*****************************************************************************
Init()
Jeťli dostepny jest licznik czasu o du┐ej dok│adnoťci, to funkcja Init()
zapamiŕtuje jego rozdzielczoťŠ i zwraca wartoťŠ true.
W przeciwnym razie zwraca wartoťŠ false i wtedy licznik nie mo┐e byŠ u┐ywany.
*****************************************************************************/
bool Init()
{
if (!QueryPerformanceFrequency(&m_ticksPerSecond))
{
// system nie posiada licznika czasu o du┐ej dok│adnoťci
return false;
}
else
{
QueryPerformanceCounter(&m_startTime);
return true;
}
} // Init()
float GetElapsedSeconds(unsigned long elapsedFrames = 1)
{
static LARGE_INTEGER s_lastTime = m_startTime;
LARGE_INTEGER currentTime;
QueryPerformanceCounter(¤tTime);
float seconds = ((float)currentTime.QuadPart - (float)s_lastTime.QuadPart) / (float)m_ticksPerSecond.QuadPart;
// "zeruje" licznik czasu
s_lastTime = currentTime;
return seconds;
} // GetElapsedSeconds()
/***************************************************************************
GetFPS()
Zwraca ťredni╣ liczbŕ klatek w okresie czasu elapsedFrames
(domyťlnie rˇwnym 1). Jeťli metoda nie jest wywo│ywana podczas tworzenia
ka┐dej ramki, to nale┐y samemu zliczaŠ liczbŕ ramek oraz zerowaŠ j╣ po
wywo│aniu metody.
***************************************************************************/
float GetFPS(unsigned long elapsedFrames = 1)
{
static LARGE_INTEGER s_lastTime = m_startTime;
LARGE_INTEGER currentTime;
QueryPerformanceCounter(¤tTime);
float fps = (float)elapsedFrames * (float)m_ticksPerSecond.QuadPart / ((float)currentTime.QuadPart - (float)s_lastTime.QuadPart);
// "zeruje" licznik czasu
s_lastTime = currentTime;
return fps;
} // GetFPS
/***************************************************************************
LockFPS()
Blokuje wykonanie programu tak, by prŕdkoťŠ tworzenia klatek nie wzros│a
ponad wartoťŠ okreťlona przez parametr metody. Metoda ta nie zapewnie
utrzymania sta│ej prŕdkoťci tworzenia klatek, a jedynie zapobiega jej
wzrostowi ponad podan╣ wartoťŠ. Natomiast prŕdkoťŠ ta w praktyce mo┐e spaťŠ
poni┐ej tej wartoťci. Zak│ada siŕ, ┐e metoda ta wywo│ywana jest podczas
tworzenia ka┐dej klatki. Metoda zwraca chwilow╣ wartoťŠ prŕdkoťci tworzenie
klatek (w klatkach na sekundŕ) <= targetFPS.
***************************************************************************/
float LockFPS(unsigned char targetFPS)
{
if (targetFPS == 0)
targetFPS = 1;
static LARGE_INTEGER s_lastTime = m_startTime;
LARGE_INTEGER currentTime;
float fps;
// odczekuje w pŕtli okres czasu, by osi╣gn╣Š zadan╣ prŕdkoťŠ
do {
QueryPerformanceCounter(¤tTime);
fps = (float)m_ticksPerSecond.QuadPart/((float)(currentTime.QuadPart - s_lastTime.QuadPart));
} while (fps > (float)targetFPS);
// "zeruje" licznik czasu
s_lastTime = m_startTime;
return fps;
} // LockFPS()
private:
LARGE_INTEGER m_startTime;
LARGE_INTEGER m_ticksPerSecond;
};
#endif // __TIMER_H_INCLUDED_