게임 엔진 개발

[게임 엔진 개발] - QueryPerformanceFrequency / QueryPerformanceCounter

LKBaekjoon 2024. 7. 1. 11:24
반응형

앞서 공부하고 정리한 내용은 무료 배포된 유튜브 "얌얌코딩"님의 강의를 시청한 후임을 밝힙니다.

LV06 Input (youtube.com)

 

얌얌코딩 (게임 개발)

어려운 게임 개발을 쉽게 배우는 방법!

www.youtube.com


DeltaTime 구해야 하는 이유


  • 만약 FPS가 100ms인 컴퓨터와 FPS가 50ms인 컴퓨터가 있다고 하자.
  • 당연히 FPS가 큰 컴퓨터일수록 성능이 좋아 cycle을 더 많이 돌릴 수 있다.
  • 지금의 내가 만든 update를 비롯한 함수들을 모두 cycle 기준으로 돌고 있다.
  • 따라서 키보드 키 바인딩을 통한 이동 함수들이 컴퓨터의 cpu 성능에 따라 동일하게 움직이지 않는다.
    • 이는 게임 내에서 매우 불리하게 작용할 수 있는 좋지 않은 요소이다.
  • 따라서 현실 시간 기준으로 움직일 수 있게 조정해야 한다.

 

QueryPerformanceFrequency


QueryPerformanceFrequency 함수 - Win32 apps | Microsoft Learn

 

QueryPerformanceFrequency 함수 - Win32 apps

성능 카운터의 빈도를 검색합니다.

learn.microsoft.com

  • 1초 동안의 성능 카운터의 빈도(Frequency)를 리턴해주는 함수이다.
  • 시스템 부팅시부터 고정되는 값이기 때문에, 매번 이 함수를 불러주는 것이 아니라 전역 변수로 어디 담아놓는 것이 프로그래머에게 이득일 수 있다.
  • DeltaTime 을 구하기 위해 사용할 수 있다.

 

QueryPerformanceCounter


QueryPerformanceCounter 함수 - Win32 apps | Microsoft Learn

 

QueryPerformanceCounter 함수 - Win32 apps

시간 간격 측정에 사용할 수 있는 고해상도(<1us) 타임스탬프를 나타내는 성능 카운터의 현재 값을 검색합니다.

learn.microsoft.com

  • 시간 간격을 측정하기 위해 위에서 언급된 함수와 동시에 사용할 수 있다.
  • 성능 카운터의 현재 값을 리턴, 즉 Tick이 될 때마다의 값을 가져온다.

 

WINBASEAPI
BOOL
WINAPI
QueryPerformanceCounter(
    _Out_ LARGE_INTEGER* lpPerformanceCount
    );

WINBASEAPI
BOOL
WINAPI
QueryPerformanceFrequency(
    _Out_ LARGE_INTEGER* lpFrequency
    );
  • 두 함수 모두 LARGE_INTERGER라는 type을 사용한다.

 

LARGE_INTERGER Type


typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
    LONGLONG QuadPart;
} LARGE_INTEGER;
  • 우선 기본적으로 LONGLONG (8바이트)로 정의된 QuadPart 부분64비트 전체의 값을 밀어넣을 수 있다.
  • 헌데 워낙 값이 크기 때문에, 상위 하위 32비트에만 접근하고 싶은 경우에 쓸 수 있게 LowPartHighPart라는 두 가지 변수를 만들어 union 꼴을 사용하고 있다.
반응형