게임 프로그래밍에서는 프레임 경과시간이 굉장히 중요합니다.
FPS( Frame Per Second ) 구할때도 필요하고, 애니메이션이나 각종 프레임 단위 처리에 요긴하게 쓰이는 수치죠.
보통 WinAPI인 GetTickCount를 이용해서 구하기도 하지만 이 함수는 몇가지 문제가 있습니다.
값이 오버플로우가 되기도 하고 스피드핵에 이용되기도 한다는거죠.
그래서 알아 보던 중 QueryPerformanceFrequency / QueryPerformanceCounter의 두 함수를 알게되었는데, CPU의 TickCount를 이용해 경과 시간을 알아낼수 있는 함수지요. 게다가 정확도도 GetTickCount보다 높으니 자주 애용해야 할듯 합니다.
void InitnStartCheckElapsedTime( void ) { LARGE_INTEGER qwTicksPerSec, qwTime; m_bUsingQPF = (bool) (QueryPerformanceFrequency( &qwTicksPerSec ) != 0); if( !m_bUsingQPF ) return; m_llQPFTicksPerSec = qwTicksPerSec.QuadPart; QueryPerformanceCounter( &qwTime ); m_llLastElapsedTime = qwTime.QuadPart; }
함수 설명 들어갑니다.
InitnStartCheckElapsedTime의 경우 QueryPerformanceFrequency의 사용가능 여부를 먼저 판별하고, 시작 틱값을 기억해 두입니다.
float GetElapsedTime( void ) { if( !m_bUsingQPF ) return -1.0; LARGE_INTEGER qwTime; QueryPerformanceCounter( &qwTime ); float fElapsedTime = (float)((double) ( qwTime.QuadPart - m_llLastElapsedTime ) / (double) m_llQPFTicksPerSec); m_llLastElapsedTime = qwTime.QuadPart; return fElapsedTime; }
GetElapsedTime에서는 이제 본래 목적인 경과 시간을 뽑게 됩니다. 프레임 처리 시작 전에 호출해주면 됩니다. 현재 틱값에서 이전 틱값을 빼준후 주파수값을 나눠 주면 경과 시간(초단위)을 얻어낼수가 있습니다.