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