초당 프레임수 (fps, Frame Per Second) 총정리
- 프로그래밍/프로그래밍일반
- 2011. 6. 12. 16:41
그래픽스 시간에 배운 것을 상기해보면,
사람눈에 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
[출처] FPS 고정 시키기.|작성자 블루로즈
이 글을 공유하기