일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Brute Force
- 그래프
- MYSQL
- 스토어드 프로시저
- 이진탐색
- String
- Hash
- 다익스트라
- two pointer
- DP
- SQL
- Dijkstra
- binary search
- Two Points
- Stored Procedure
- union find
- Trie
Archives
- Today
- Total
codingfarm
타이밍과 애니메이션 본문
애니메이션을 정확히 수행하려면 시간을 측정해야한다. 특히, 애니메이션의 프레임들 사이에 흐른 시간과 양을(경과시간; 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;
}
'computer graphics > DirectX11' 카테고리의 다른 글
Direct3D의 초기화 - 뷰포트 설정 (0) | 2020.11.29 |
---|---|
Direct3D의 초기화 - 뷰들을 출력 병합기 단계에 묶기 (0) | 2020.11.29 |
Direct3D의 초기화 - 깊이, 스텐실 버퍼와 뷰 생성 (0) | 2020.11.28 |
Direct3D의 초기화 - 렌더 대상 뷰의 생성 (0) | 2020.11.28 |
Direct3D의 초기화 - 교환 사슬의 설정 및 생성 (0) | 2020.11.28 |
Comments