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();
}
뛰어난 성능의 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 성능에 따라 캐릭터 이동 속도가 변하는 것 방지)
'(2022) 공부 (Study) > 게임 개발 (Development)' 카테고리의 다른 글
[Win32API] GetAsyncKeyState() 와 키 입력 받기 (1) (0) | 2022.04.13 |
---|---|
[Win32API] 오브젝트 이동 : 시간 동기화 (2) (0) | 2022.04.13 |
[Win32API] 오브젝트 이동 : 시간 동기화 (1) (0) | 2022.04.13 |
[Win32API] GetDC() ~ ReleaseDC() 함수 (0) | 2022.04.13 |
[Win32API] BeginPaint()와 무효화 영역의 관계 (0) | 2022.04.13 |