(2022) 공부 (Study)/게임 개발 (Development)

[Win32API] GetTickCount64를 이용한 호출 횟수 및 프레임 체크

수낭 2022. 4. 13. 12:10

 

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
	...

    MSG msg;
    while (true)
    {
        if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
                break;

            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        else
        {
        	CCore::GetInst()->progress();
        }
    }
    return (int) msg.wParam;
}

 

void CCore::progress()
{
	static int callCount = 0;
	++callCount;

	static int iPrevCount = GetTickCount64();
	int iCurCount = GetTickCount64();
	if (iCurCount - iPrevCount > 1000)
	{
    	// 1초 경과시 진입
		iPrevCount = iCurCount;
		callCount = 0;
	}

	update();
	render();
}

 

1초 동안 찍힌 callCount(호출횟수) 값

뛰어난 성능의 PC가 아님에도 1초당 22827회 호출이라는 어마어마한 수치가 찍힌 모습이다.

// [1] update()는 그리기 작업을 하는 곳이 아니라, 
// 물체들의 변경점(좌표, 등)들을 체크하는 곳이다.
void CCore::update()
{
	// 비동기 키 입력 함수를 써보자
	// return되는 SHORT 값은, 단순 눌림 여부가 아닌, 눌린 상태(tab, hold, release)도 알려준다.
	// 이순간 눌렸는지만 체크하려면, & 0x8000 비트만 보면 된다.(가장 상위 비트)

	// 해당 키가 눌린 경우에만 진입
	if (GetAsyncKeyState(VK_LEFT) & 0x8000)
	{
		g_obj.m_ptPos.x -= 1;
	}
	if (GetAsyncKeyState(VK_RIGHT) & 0x8000)
	{
		g_obj.m_ptPos.x += 1;
	}
	if (GetAsyncKeyState(VK_UP) & 0x8000)
	{
		g_obj.m_ptPos.y -= 1;
	}
	if (GetAsyncKeyState(VK_DOWN) & 0x8000)
	{
		g_obj.m_ptPos.y += 1;
	}
}

// [2] update 함수에서, 변경점들이 적용되고, FIX된 상태가 되면, 
// render()에서 최종적으로 그리기를 맡는다.
void CCore::render()
{
	// 그리기
	Rectangle(m_hDC, g_obj.m_ptPos.x - g_obj.m_ptScale.x / 2
					, g_obj.m_ptPos.y - g_obj.m_ptScale.y / 2
					, g_obj.m_ptPos.x + g_obj.m_ptScale.x / 2
					, g_obj.m_ptPos.y + g_obj.m_ptScale.y / 2);
}

위와 같은 코드를 작성한 경우, 0.1초도 안되는 짧은 키보드 누름에도
g_obj.m_ptPos.x += 1; 과 같은 코드가 최소 2천번 이상 호출될 것임을 알 수 있다.
(Timer를 이용해서 키보드 눌림과 시간 동기화가 필요한 이유)
(PC 성능에 따라 캐릭터 이동 속도가 변하는 것 방지)