TimeManager
2022. 12. 23. 18:24ㆍ개인공부/Win32API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#pragma once
class CTimeMgr
{
SINGLE(CTimeMgr);
private:
LARGE_INTEGER m_IICurCount;
LARGE_INTEGER m_IIPrevCount;
LARGE_INTEGER m_IIFrequency;
double m_dDT; // 프레임 간의 시간 값
double m_dAcc; // 1초 체크를 위한 누적 시간
UINT m_iCallCount; // 함수 호출 횟수 체크
UINT m_iFPS; // 초당 호출횟수
// FPS
// 1. 프레임당 시간 (Delta Time)
public:
void init();
void update();
public:
double GetDT() { return m_dDT; }
float GetfDT() { return (float)m_dDT; }
};
|
|
|
cs |
TimeMgr 은 싱글톤 패턴이고 컴퓨터 성능에 상관없이 게임을 진행하기 위해서 설계를 하였다
1
2
3
4
5
6
7
8
|
void CTimeMgr::init()
{
// 현재 카운트
QueryPerformanceCounter(&m_IIPrevCount);
// 초당 카운트 횟수
QueryPerformanceFrequency(&m_IIFrequency);
}
|
cs |
처음 시작하면 현재 카운트 와 초당 카운트 횟수를 받아온다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
void CTimeMgr::update()
{
QueryPerformanceCounter(&m_IICurCount);
// 이전 프레임의 카운팅과, 현재 프레임 카운팅 값의 차이를 구한다.
m_dDT = (double)(m_IICurCount.QuadPart - m_IIPrevCount.QuadPart) / (double)m_IIFrequency.QuadPart;
// 이전 카운트 값을 현재값으로 갱신(다음번에 계산을 위해서)
m_IIPrevCount = m_IICurCount;
++m_iCallCount;
m_dAcc += m_dDT; // DT 누적
if (m_dAcc >= 1.)
{
m_iFPS = m_iCallCount;
m_dAcc = 0.;
++m_iCallCount = 0;
wchar_t szBuffer[255] = {};
swprintf_s(szBuffer, L"FPS : %d, DT : %f", m_iFPS, m_dDT);
SetWindowText(CCore::GetInst()->GetMainHwnd(), szBuffer);
}
}
|
cs |
m_dDT 는 한 프레임에 흐르는 시간을 나타낸값으로 프레임당 계속해서 더해주면 m_dAcc =1 인 지점은 1초가 지난 시점으로 icallcount 는 fps를 나태내고 그값들을 윈도우 프로그램 창에 나타내었다.
'개인공부 > Win32API' 카테고리의 다른 글
Object (0) | 2022.12.25 |
---|---|
KeyManager (2) | 2022.12.24 |
공부 정리 (0) | 2022.12.21 |
PeekMessage (0) | 2022.12.19 |
WM_PAINT (2) | 2022.12.18 |