[WinAPI] deltatime 설정하기 (QPC)

jh Seo·2024년 1월 30일
0

winapi공부

목록 보기
4/6

개요

똥피하기류 게임을 winapi로 구현해보는 중이다.
while문에서 peekmessage와 else문을 이용해서 구현해보니, 너무 프레임이 빨라서
고사양 타이머 QPC를 이용해 유니티의 time.deltatime을 구현해보기로 했다.

QueryPerformanceCounter

<windows.h> 헤더파일에 포함된 녀석이다.

시간 간격 측정에 사용할 수 있는 고해상도(<1us) 타임스탬프를 나타내는 성능 카운터의 현재 값을 검색합니다.

이녀석의 parameter의 자료형은 LARGE_INTEGER이다.

	//현재 카운터
	LARGE_INTEGER m_nCurCnt;
    //이전 카운터
	LARGE_INTEGER m_nPrevCnt;
    //초당 갯수
	LARGE_INTEGER m_nFrequency;

64비트 정수를 저장하는 공용체로 정수를 불러올 때는 quadpart를 통해 불러온다.

QueryPerformanceFrequency

성능 카운터의 주파수(빈도)를 검색한다.

현재 성능 카운터 빈도(초당 개수)를 수신하는 변수에 대한 포인터입니다.

parameter로 m_nFrequency를 넣어 빈도를 받아온다.
이 빈도는 performanceCounter가 1초동안 증가하는 횟수로, 초당 틱 수다.
(counts per second)

구현

void TimeManager::Init()
{
	//현재 카운트
	QueryPerformanceCounter(&m_nPrevCnt);
	QueryPerformanceFrequency(&m_nFrequency);	
}

init함수에서 m_nPrevCnt값에 틱을 넣어준 후,
m_nFrerquency에 주파수를 넣어준다.

void TimeManager::Update()
{
	QueryPerformanceCounter(&m_nCurCnt);

	//delta time구하기
	m_nDeltaTime = static_cast<double>(m_nCurCnt.QuadPart - m_nPrevCnt.QuadPart) 
    / static_cast<double>(m_nFrequency.QuadPart);
    
	m_nPrevCnt = m_nCurCnt;

매 반복문마다 호출되는 Update에서 일어나는 일이다.
매 update문마다 현재 카운터값을 m_nCurCnt에 저장해준다.

프레임 간격의 시간 delta time을 구하는 법은
1. 이전 프레임의 카운터 값 m_nPrevCnt에서 m_nCurCnt값을 빼서 해당 프레임동안 증가한 틱 수 계산해준다.
2. queryPerformanceFrequency함수를 통해 1초동안 증가한 틱수를 계산해준다.
3. m_nCurCnt.QuadPart - m_nPrevCnt.QuadPart / m_nFrequency.QuadPart
식을 통해 프레임 간격의 시간을 알 수 있다!

이제 timer을 싱글톤 패턴으로 구현 후,
m_nDeltaTime을 get함수로 하나 만들고 해당 함수를 호출하면 deltatime을 사용할 수 있다.

profile
코딩 창고!

0개의 댓글