블로그는 나의 힘!
[ Programing ]/Algorithm2009. 12. 24. 00:26

[ ( fAfter -fBefore ) /fTime; ] 가속도
 
// 이전 좌표 값, 이후 좌표 값(이동 위치), 시간
const float GhostAction::_IsAcceleration( float fBefore, float fAfter, float fTime )
{  
     return ( fAfter -fBefore ) /fTime;
 
// 가속도만 계산 되어 리턴한다. 이 가속도를
fMove   = ( 지정 이동할 거리 + 세분 시간( 1초 / 60프레임 ) + 지정 속도 ) 
              +_IsAcceleration( m_fBeforeSpeed, m_fAfterSpeed, 1 );

// 계산 하면 가속도 적용 이동 처리 완료

Posted by Mister_Q
[ 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
[ Programing ]/API2009. 12. 24. 00:21

[ QueryPerformanceCounter() 이용하여 GetTickCount() 보다 더 정확한 프레임 측정 1 ]

 LARGE_INTEGER TimeBefore;      // 초기 초당 카운터 값
 LARGE_INTEGER TimeAfter;         // 초당 카운터 변화 값
 LARGE_INTEGER FrameInfor;       // 프레임 정보
 double  Time = 0;      // 초당 카운터 누적 값
 int   Count = 0;          // 카운터
 int   frame = 60;        // 초당 60 프레임


 QueryPerformanceFrequency( &FrameInfor );      // 초당 정보.
 QueryPerformanceCounter( &TimeBefore );         // 초당 카운터 변화값 

 printf( "Test : %f \n", (double)FrameInfor.QuadPart /60 );
 
 while( true ) 
 {

    QueryPerformanceCounter( &TimeAfter );

     //  1 초 / (현재값-이전값)  =  1 미만 시 1초

    Time = 1 / ( ( (double)TimeAfter.QuadPart -(double)TimeBefore.QuadPart ) / (double)FrameInfor.QuadPart );     


    //printf( "test : %f \t\t %f \n ", Time, 1 /Time );


    if( 1 > Time ) break;        // 1초가 되면 종료
    Count++;
 }
 
 printf( "TIME : %f \n", Time );
 printf( "COUNT : %d \n", Count );
 
 
 /////////////// 프레임 확인 ////////////////////

 int temp2 = Count % 60;
 frame = Count / 60;
 frame += temp2;
 
 /////////////// 출력 확인 //////////////////////
 int temp = 0;
 
 while( Count > 0 )
 {
  Count -= frame;  
  temp++;  
 }
 printf( "Count : %d, \t Frame : %d, \t Fr : %d, \t Fr%% : %d \n", Count, temp, frame, temp2 );


 return 0; 




- 핵심 : QueryPerformanceFrequency( &FrameInfor );        QueryPerformanceCounter( &TimeBefore );




추가 링크 : 

[프레임] QueryPerformanceCounter() 이용하여 GetTickCount() 보다 더 정확한 프레임 측정2

[ QueryPerformanceCounter() 이용하여 GetTickCount() 보다 더 정확한 프레임 측정 ]



Posted by Mister_Q