FPS를 체크해 보자.
FPS(Frame Per Second)는 1초동안 표시되는 프레임수를 나타내는 것으로 게임이나 동영상의 성능을 측정하는 아주 중요한 수단이다.

측정방법은 이렇다.
일정기간동안 프레임표시횟수와 걸린시간을 체크했다가 이를 토대로 FPS를 계산해서 윈도창 제목에다 FPS를 표시하는 것이다.
간단하지 아니한가?




* 사전준비
FPS측정 함수를 만들기전에 Game1(특별히 바꾸지않았다면 Draw가 포함된 클래스)에서 준비해야할 것이있다.
첫째, 일단 FPS표시는 프로그램이 돌아가는 동안 지속적으로 시간을 체크해야하므로 전역변수나 그에 준하는 멤버변수가 필요하다.
둘째, 기본적으로 프레임이 모니터 수직동기화와 FPS60으로 맞춰져 있으므로 이를 풀어줘야 한다.

Game1클래스에 아래의 멤버변수를 추가하자.

private const float UPDATEINTERVAL = 1.0f; //측정의 기준기간, 더 늘리거나 줄여도 된다
private float m_fTimeSinceLastUpdate = 0.0f; //소요된 시간
private float m_fFramecount = 0; //프레임표시횟수


이젠 Game1의 생성자에 아래의 코드를 추가하여 모니터 수직동기화와 FPS60을 풀어주자

graphics.SynchronizeWithVerticalRetrace = false;    //Draw를 모니터 수직동기화하지 않음
IsFixedTimeStep = false;    //Update를 기본값(1/60초)로 하지 않음

자 이젠 준비가 완료되었다.

* 본격작성
그럼 BenchMark함수를 아래와 같이 작성하자

private void BenchMark(GameTime gameTime)
{
    float elapsed = (float)gameTime.ElapsedRealTime.TotalSeconds;
    m_fFramecount++;    //프레임카운트
    m_fTimeSinceLastUpdate += elapsed;

    //충분한 시간(UPDATEINTERVAL)을 FPS계산 구간으로 삼음
    if (m_fTimeSinceLastUpdate > UPDATEINTERVAL)
    {
        float fFps = m_fFramecount / m_fTimeSinceLastUpdate;    //FPS계산 - 프레임카운트 / 경과시간
        Window.Title = "FPS:" + fFps.ToString()
            + " - RT:" + gameTime.ElapsedRealTime.TotalSeconds.ToString()   //Draw호출당시간
            + " - GT:" + gameTime.ElapsedGameTime.TotalSeconds.ToString();  //Update호출당시간
        m_fFramecount = 0;
        m_fTimeSinceLastUpdate = 0.0f;
    }
}

* 수행
이제 BenchMark를 Draw함수에서 호출 해주면 된다.
base.Draw(gameTime) 호출 직전에 불러주면 될 것이다.

생성자에 추가했던 IsFixedTimeStep설정을 true로 하고 실행해보면 FPS 60에 거의 맞아떨어진다는 것도 확인 할 수 있을 것이다.(별다른 무거운 작업을 하지 않았다면 말이다)
Google AdSense

+ Recent posts