Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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 29 30
Archives
Today
Total
관리 메뉴

codingfarm

타이밍과 애니메이션 본문

computer graphics/DirectX11

타이밍과 애니메이션

scarecrow1992 2020. 11. 29. 15:40

애니메이션을 정확히 수행하려면 시간을 측정해야한다. 특히, 애니메이션의 프레임들 사이에 흐른 시간과 양을(경과시간; elpased time)을 측정할 수 있어야 한다.

 


1. 성능 타이머(Performance Timer)

시간 측정을 위해 Windows가 제공하는 성능 타이머(performance timer)를 사용한다. 이를 성능 카운터(poerformance counter)라고도 한다. 성능 타이머를 조회하는 Win32 함수를 사용하려면 windows.h 헤더파일을 추가해야 한다.

 

성능 타이머는 시간을 개수(count) 단위로 측정한다. 성능 타이머로부터 개수 단위의 현재 시간을 얻을 때에는 다음과 같이 QueryPerformanceCounter 함수를 사용한다.

__int64 currTime;
QueryPerformanceCounter((LARGE_INTEGER*) &currTime);

위 함수는 매개변수를 통해서 현재 시간 값을 돌려준다.

 

성능 타이머의 주파수(초당 갯수)를 얻을때에는 다음과 같이 QueryPerformanceFrequency함수를 사용한다.

__int64 countsPerSec;
QueryPerformanceFrequency((LARGE_INTEGER*) &countsPerSec);

 

갯수와 주파수로부터 초 단위 시간을 얻을 수 있다.

mSecondsPerCount = 1.0 / (double)countsPerSec;
valueInSecs = valueInCounts * mSecondsPerCount;

우선 주파수의 역수를 취해서 개수다 초를 얻은 후, valueIncCounts에 곱하면 초 단위 시간이 나온다.

 

이번에 얻은 QueryPerformanceCounter의 값에 저번에 얻어낸 값을 빼면 지난번 함수 호출로부터 흐른 시간을 얻을 수 있다.

__int64 A = 0;
Query{erformanceCounter((LARGE_INTEGER*) &A);

/*특정 작업들을 실행한다*/

__int64 B = 0;
QueryPerformanceCounter((LARGE_INTEGER*) &B);

__int64 mSecondsPerCount;
QueryPerformanceFrequency((LARGE_INTEGER*) &,SecondsPerCount);
valueDiff = (B - A) * mSecondsPerCount;

 

 


2. GameTimer 클래스

GameTimer 클래스의 정의와 구현에 대해 알아본다.

이는 윈도우즈나 D3D11에서 공식적으로 제공하는것이 아니라 임의로 만든 클래스이다.

 

class GameTimer{
public:
    GameTimer();
    
    float GameTime() const;
    float DeltaTime() const;
    
    void Reset();
    void Start();
    void Stop();
    void Tick();
    
private:
    double mSecondsPerCount;
    double mDeltatime;
    
    __int64 mBaseTime;
    __int64 mPausedTime;
    __int64 mStopTime;
    __int64 mPrevTime;
    __int64 mCurrTime;
    
    bool mStopped;
};

GameTimer::GameTimer()
: mSecondsPerCount(0.0), mDeltaTime(-1.0), mBaseTime(0),
  mPausedTime(0), mPrevTime(0), mCurrTime(0), mStopeed(false){
    __int64 countsPerSec;
    QueryPerformanceFrequency((LARGE_INTEGER*) &countsPerSec);
    mSecondsPerCount = 1.0 / (double) countsPerSec;
}

 

 

 

 

Comments