본문 바로가기

WinAPI

[WinAPI] 델타 타임

지난번에 PeekMessage함수를 이용할 때 else 블럭에 카운트를 만들어 일정 카운터가 달성될 때 마다 한번씩 Run함수가 실행되게 만들었다. 왜냐하면 실제로 메시지루프가 엄청 빠르게 반복하기 때문에 사각형이 보이지도 않을 정도로 빠르게 움직이기 때문이다. 그런데 그렇게 하지 않고 델타 타임을 이용해서 사각형의 속도를 조절할 수 있다.

 

  QueryPerformanceFrequency(&g_tSecond);
  QueryPerformanceCounter(&g_tTime);

 

메인 함수의 메시지 루프 전에 위 코드를 작성한다. Performance Counter은 현재 CPU의 클럭수를 반환하고 Frequency는 주파수(초당 진동수)를 나타낸다. 주파수는 전역으로 선언한 float형 변수 g_tSecond에, 현재 클럭수는 LARGE_INTERGER형 변수 g_tTime에 저장한다. LARGE_INTEGER을 이용하는 이유는 클럭수가 그만큼 빨리 올라가기 때문이다.  둘을 이용해서 진동 수를 시간 단위로 변환할 수 있다.

 

  //DeltaTime 구해줌
    LARGE_INTEGER tTime;
    QueryPerformanceCounter(&tTime);
    g_fDeltaTime = (tTime.QuadPart - g_tTime.QuadPart) / (float)g_tSecond.QuadPart;

    g_tTime = tTime;

    //플레이어 초당 이동속도 : 300
    float fSpeed = 300 * g_fDeltaTime;
    
     if (GetAsyncKeyState('D') & 0x8000)
    {
        g_tPlayerRC.l += fSpeed;
        g_tPlayerRC.r += fSpeed;
    }

 

위 코드는 Run함수 내부 코드이다. tTime을 선언하고 현재 클럭수를 저장한다. 그래서 tTime과 g_tTime을 빼면 메시지루프 들어가기 전부터 Run함수 실행될 때까지 발생한 클럭수를 알 수 있고 주파수(초당 진동수)로 나누면  클럭이 1회 발생했을 때 걸린 시간을 알 수 있다. 이렇게 계산된 값을 델타타임으로 지정한다. 그래서 그 시간에 속도 300을 곱한 fSpeed는 이동하는 거리가 된다. 이렇게 델타타임을 이용하면 CPU 클럭이 1회 발생하는 것을 기준으로 시간을 측정해 일정한 속도로 사각형을 이동시킬 수 있다. 그리고 CPU 클럭이 1회  발생하는 시간은 아주 짧은 시간이기 때문에 아주 작은 단위의 시간에 대해 제어할 수 있다.

'WinAPI' 카테고리의 다른 글

[WinAPI] 더블 버퍼링  (0) 2022.01.20
[WinAPI] 삼각함수  (0) 2022.01.16
[WinAPI] PeekMessage와 윈도우 창 크기 설정  (0) 2022.01.15
[WinAPI] 도형 그리기, 마우스 좌표  (0) 2022.01.15
[WinAPI] 기본 윈도우 창  (0) 2022.01.15