게임 프로그래밍에서는 프레임 경과시간이 굉장히 중요합니다.
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에서는 이제 본래 목적인 경과 시간을 뽑게 됩니다. 프레임 처리 시작 전에 호출해주면 됩니다. 현재 틱값에서 이전 틱값을 빼준후 주파수값을 나눠 주면 경과 시간(초단위)을 얻어낼수가 있습니다.

+ Recent posts