초당 프레임수 (fps, Frame Per Second) 총정리

< 초당 프레임 수 (fps, Frame Per Second) >
 
비디오나 필름의 프레임(화면)이 바뀌는 속도를 초 단위로 나타내는 단위. 영화는 초기에 초당 16프레임이었으나 현재 24프레임이며 NTSC 방식 텔레비전은 격행 주사 방식을 채택하기 때문에 2개의 필드가 1프레임이 되어 초당 30프레임이다.

그래픽스 시간에 배운 것을 상기해보면,
사람눈에 1초당 15프레임정도가 들어오면 깜빡임현상을 거의 못느낀다고 한다.
그렇지만 Nyquist 정리에 의해 2배인 30프레임을 사용한다고 함.호홓홓  


< fps코딩하는 방법 >

0. timeGetTime(), GetTickCount()이해하기
[프로그래밍/WindowsAPI] - timeGetTime() GettickCount() 함수 총정리

 

1. 
timeGetTime() 으로 FPS구하기
 
 
void UpdateFPS()
{

    static DWORD frameCount = 0;            //프레임 카운트수
    static float timeElapsed = 0.0f;            //흐른 시간
    static DWORD lastTime = timeGetTime();   //마지막 시간(temp변수)
 

 
   DWORD curTime = timeGetTime();      //현재 시간
    
float timeDelta = (curTime - lastTime)*0.001f;        //timeDelta(1번생성후 흐른 시간) 1초단위로 바꿔준다.

    timeElapsed += timeDelta; 

    frameCount++;

    if( timeElapsed >= 1.0f )         //흐른시간이 1초이상이면 내가 하고싶은것 처리
    {
        float fps = (float)frameCount/timeElapsed;
        sprintf_s( pFPS, sizeof(pFPS), TEXT("게임속도 FPS: %f"), fps );     //FPS출력 하는 소스

        frameCount = 0;
        timeElapsed = 0.0f;
    }
    else
    {
    
 //흐른 시간이 1초가 안되면 생략함  
     //Sleep() 해도되고 안해도 되구~ 

     } 

    lastTime = curTime;
}

그리고나서 Render() 나 Frame() 같은 함수안에 UpdateFPS(); 를 넣어주고,

TCHAR pFPS[256]; 를 출력해준다.
출력하는 함수는 ID3DXFont::DrawText (권장), CD3DFont::DrawText (간단하지만 한글 출력 안됨) 등을 알아본다.

Empty Project 인데 FPS가 60 등으로 고정될때에는 DirectX Device 초기화 부분에서 다음을 설정해준다.
D3DPRESENT_PARAMETERS d3dpp;
...
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;


2. GetTickCount()를 사용하여 프레임 고정


#include <stdio.h>

#include <windows.h>


void main()
{
   int StartTick; 
       while(1)
       
{
           
StartTick = GetTickCount();  

          while( GetTickCount() - StartTick >= 1000 );      //1초마다 한번씩 들어가게끔
          {
            printf ("1초마다 한번씩 실행됩니다\n");

          }
          else
          {
              // 딜레이를 주는 부분
          } 

      }
 
}


<고정 프레임 하는 방법>

방법1.
 

3D 렌더링을 하다보면 계산량이 많은 부분에서는 fps에 낮게 나와 실행 속도가 느리고 계산량이 적은 부분에서는 fps가 높게 나와 실행 속도가 빨라 부드러운 3D 렌더링을 하는데 문제가 생기는 경우가 있다.

이를 위해서 계산량이 많든 적든간에 fps를 고정시키는 방법이 있는데, 다음 코드를 응용하면 된다.

 

 static DWORD frameDelta = 0; 

 static DWORD lastTime =timeGetTime(); 

//무한 루프 

 DWORD currTime = timeGetTime(); 

 frameDelta = (currTime - lastTime) * 0.001f;

 DWORD FPS = 15;                     //15(FPS)라는 숫자가 fps를 결정한다.숫자가 작을수록 더 많은 프레임을 그린다..

                                    //컴퓨터 성능에 따라 테스트하여가장 느린 fps를 검출한 후 결정한다.

if(frameDelta >=  1 / FPS )

{

   //렌더링 하는 부분.
  
   lastTime = currTime;

 }else{
  Sleep( frameDelta-1/FPS ); //넣어줘도 되고 그냥 주석 처리해도 상관 없음니다.

 }


방법 2. 

위의 UpdateFPS()에서 else부분에 Sleep()를 사용해서 줄여준다
 
Sleep( 0.8f*1000 );   // 1fps 

//Sleep( 0.2f*1000 );   // 10fps 
//Sleep( 0.05f*1000 );   // 20fps 
//Sleep( 0.02f*1000 );   // 50fps 
//Sleep( 0.002f*1000 );   // 100fps 
 

[출처] FPS 고정 시키기.|작성자 블루로즈

 
 

이 글을 공유하기

댓글

Designed by JB FACTORY