블로그는 나의 힘!
[ Programing ]/API2009. 12. 24. 00:23
[ QueryPerformanceCounter() 이용하여 GetTickCount() 보다 더 정확한 프레임 측정 2 ]

(1초.)
근데 이렇게 까지는 할 필요 없고.
보통은 다음 방법과 같이 쓴다.
float PerformanceCountPerFrame = QueryPerformanceFrequency / frameCount;
 
이게 최초에 시스템이 켜질때 초기화 되고.
이값은 변하면 안된다.
frameCount 이건 사용자가 원하는 프레임.
앞에 const 붙이는 것도 한 방편이 될거다.
그다음으로
매번 프레임을 측정하는데
 
float FrameGap = QueryPerformanceCounter(현재) - QueryPerformanceCounter(이전);
 
으로 값을 구한후
 
if( FrameGap > PerformanceCountPerFrame ) 이라면
Render를 호출후에
QueryPerformanceCounter(이전) = QueryPerformanceCounter(현재)값을 대입한다.
그게 아니라면 스킵해서 다음 측정할떄까지 대기. 
 
 
//////////////////////////////////////////////////////////////////////////////
 
 
 LARGE_INTEGER TimeBefore;    // 초기 초당 카운터 값
 LARGE_INTEGER TimeAfter;      // 초당 카운터 변화 값
 LARGE_INTEGER FrameInfor;    // 프레임 정보
 double  Time = 0;        // 초당 카운터 누적 값
 int   Count = 0;           // 카운터
 const int frame = 60;   // 초당 60 프레임 
 
 QueryPerformanceFrequency( &FrameInfor );    // 초당 정보.
 QueryPerformanceCounter( &TimeBefore );       // 초당 카운터 초기값
 
 const double PerFrame = (double)FrameInfor.QuadPart /frame;    // 초당 프레임 간격 설정.
 printf( "Test : %f \n", PerFrame );
 
 while( true )
 {
    QueryPerformanceCounter( &TimeAfter );       // 초당 현재 카운터 변화값
    Time = (double)TimeAfter.QuadPart -(double)TimeBefore.QuadPart;    // 현재값 - 이전값
 
    // 설정 프레임 간격시 호출 ( 60프레임으로 설정 했다면.  1 ~ 60 프레임 )
    if( PerFrame < Time )    
    {
       TimeBefore = TimeAfter;      // 이전값 현재값으로 갱신
       printf( "Count Frame : %d, Time : %f \n", Count++, Time );
   
       if( frame == Count ) break;   // 1초라면 종료
    }      
 }

 printf( "Time 1Second \n " );




추가 링크 : 

Posted by Mister_Q