개발/Graphics

프레임과 FPS

huiyu 2018. 8. 4. 16:20

프레임(Frame)
 일반적인 움직임을 TV같은 디스플레이에 표시할 때는 일정한 시간 간격으로 움직임을 잘라내 연속으로 표시한다.
이 한장면에 해당하는 시간 간격을 프레임(Frame)이라고 한다.

프레임은 연속된 움직임의 최소 단위이다. 일반적인 시간은 1초를 60번 나눈 1/60초이다. 
이는 일반적으로 디스플레이에ㅐ 표시를 동기화(수직 동기)하는 시간이 1/60초인데 프레임이 이 동기화를 사용하기 때문이다.


FPS(Frame Per Second)
프레임의 제일 짧은 시간이 1/60초이지만 이는 게임마다 다를 수 있다.
1/30초나 1/20초를 사용할 수도 있는데, 이렇게 준비하는 시간이 길어지면 그만큼 그림을 만드는 데 사용하는 시간이 두배가 된다는 것을 의미한다.
이를 이용해 조금더 복잡한 처리를 할 수 있다.

FPS란 Frame Per Second(초당 프레임 수)의 약어로, 1초에 화면에 그려지는 프레임 수를 의미한다.
60 fps란 1초동안 60개의 프레임을, 30 fps는 1초에 30개의 프레임을 그린다는 의미이다.


이를 간단하게 소스코드로 구현하면,
아래와 같이 할 수 있다. (SDL sample)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const int FPS = 60;
int lastTime = SDL_GetTicks();
int fpsLastTime = SDL_GetTicks();
int frameCount = 0;
while(1) {
   //event
   SDL_PollEvent();
   ...
 
   //60FPS
   if ((SDL_GetTicks() - lastTime) > 1000 / FPS )
   {
        SDL_UpdateWindowSurface(ad.window);
        lastTime = SDL_GetTicks();
        frameCount++;
   }
 
   //Print FPS
   if( (SDL_GetTicks() - fpsLastTime) > 1000 )
   {
        SDL_Log("fps : %d\n", frameCount);
        fpsLastTime = SDL_GetTicks();
        frameCount = 0;
   }
}
cs

SDL_GetTicks()는 SDL에서 제공하는 api로 SDL을 초기화 한 후의 경과시간을 ms단위로 받아온다.
1초를 60번 나눠서, 이거에 해당하는 시간에만 화면을 갱신해주고 있다.
이렇게 되면 1초에 60번 화면을 그려주게 된다.

마찬가지로 현재 fps를 출력하는 것도,
현재시간과 마지막시간의 차가 1초를 경과했을 때의 화면에 그려진 프레임의 갯수를 세서 출력해주면
현재 FPS 정보도 출력할 수 있다.


728x90
반응형

'개발 > Graphics' 카테고리의 다른 글

SDL Sprite Animation  (0) 2018.08.19
프레임 드롭현상과 대책  (3) 2018.08.18
OpenGL Texture 그리기  (0) 2018.08.04
OpenGL IBO를 사용한 큐브 그리기  (0) 2018.07.22
OpenGL IBO를 사용한 직사각형 그리기  (0) 2018.07.22