개발/Graphics

프레임 드롭현상과 대책

huiyu 2018. 8. 18. 09:46

- 프레임 : 영상을 연속해서 나타나는 데 사용하는 최소 단위, 프레임에는 1/60초나 그 이상(1/30초 등)의 시간이 있다. 이 시간 안에 해당 순간의 장면을 표현하는 처리를 한다. 구체적으로 플레이어나 적의 움직임, 게임 판정 부분, 그림을 그리는 그래픽 처리 등이 있다.

디스플레이 동기화를 사용해 처리하므로 혹시 매우 짧은 시간 안에 끝났더라도 동기화 시간까지 대기하는 것이 일반적

반대로 플레이어 처리가 생각했던 것보다 시간이 더 걸리가나 적 수가 증가해 프레임 안의 처리가 프레임 시간안에 끝나지 않을때는 다음 동기화 타이밍을 기다린다. 

이렇게 원래 처리 시간에 처리가 끝나지 않아서 계속 처리할 때를 프레임 드롭이라고 한다.

프레임 드롭이 발생해도 큰 문제가 없어 보이지만, 1/60초로 가정하고 구성한 처리가 실제로는 1/30초 동안 수행되므로 버그가 발생한다.
그 중 가장 흔한 것이 이동 처리이다.


예를 들어 플레이어가 프레임마다 벡터(5,0)만큼 진행하는 프로그램을 작성할 때,
같은 시간동안 두번 처리해야 할 것을 프레임드롭이 발생하면 한번 밖에 수행하지 않게 된다.
그래서 4프레임을 처리할 때 정상일 경우 20만큼 이동을 하지만, 프레임 드롭이 발생하면 10만큼 이동하여 플레이어는 속도가 느려졌다고 확실하게 느끼게 된다.


프레임 드롭 대책

 - 게임의 기본  fps를 다시 생각
 - 프레임을 건너뛴다(프레임 스킵)
 - 앞 프레임과 시간 차이를 계산한다.
 - 포기한다(아무것도 하지 않는다.)

1. 게임의 기본 fps를 다시 생각한다.
 - 60fps로 게임을 만들었을 때, 빈번하게 프레임 드롭이 발생한다면 정말 60fps로 만들어야할지 다시 고민해야한다.
 30fps로 다시 변경할 땐, 사용자는 느려진 걸 느끼지 못하도록 모든 처리량을 2배 늘려서 느려졌단 걸 느끼지 못하게 처리해야 된다.

 1) 60fps
   - 장점 : 움직임이 부드럽다.
   - 단점 : 처리 시간이 짧아 프레임 드롭 발생 가능성이 높다.
 2) 30fps
   - 장점 : 처리 시간이 길어 프레임 드롭이 발생할 가능성이 낮다. 시간이 걸리는 처리도 가능
   - 단점 : 움직임이 거칠다.

-> 60으로 할지, 30으로 할지는 게임의 특성에 따라 결정해도 된다. 세밀한 움직임을 중시하는 격투 게임은 60fps로 하고, 화면이 화려하고 적이 많이 나오는 경우 30fps로 하는 식으로.


2. 프레임을 건너 뛴다(프레임 스킵)

 - 프레임 드롭이 발생하면 원래 1/60초에 수행하는 처리를 1/30초에 수행하게 된다.

  프레임 스킵 : 바로 앞 그림 그리기 처리에서 프레임 드롭이 발생하면 동기화를 기다리지 않고 바로 계산 처리만 다시 수행한다. 계산 처리 후 결과적으로 모든 것이 다시 맞물려 들어갈 때 동기화를 기다린다. 

즉 프레임 드롭이 발생할 경우 1/30초의 처리를 2회 수행하게 된다. 그래서 60fps를 유지할 수 있다.

이 방법으로 평소 60fps로 가동하고, 프레임 드롭이 발생했을 때는 그림 그리기 처리에서 만든 그림을 30fps로 갱신하면서 게임 내부의 움직임을 60fps로 유지할 수 있다. 그러면 사용자에게 동작이 느려졌다는 느낌을 주지 않고 게임을 동작시킬 수 있다.


3. 앞 프레임과 시간 차이를 계산한다.

 60fps일 경우 평소에 1/60초를 넘겨받게 된다. 그러나 프레임 드롭이 발생하게 되면 1/30초를 넘겨받는다.

간단히 이동으로 설명하면,

1프레임에 (5,0)씩 이동한다는 것은 1/60초동안 (5,0)을 진행하는 것인데, 프레임 드롭이 발생하여 1/30초를 넘겨 받게 된다면 (5,0)의 두배인 (10,0)을 이동시킨다.

(이동량) = (기본 이동량) / (1/60초) * (앞 프레임 시간)


4. 포기한다.(아무것도 하지 않는다.)

 그냥 프레임이 드롭이 발생했을때 느려지게 냅둔다... 게임에 지장이 없다면 느려지게 두는것도 상관이 없다고...
 예전 게임은 프레임 드롭이 발생하는게 게임에 매력을 더하는 면도 있었다고 한다.. 게임 에뮬레이터엔 그래서 일부러 프레임 드롭을 재현하는 것도 있다고 한다.


728x90
반응형

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

텍스쳐 맵  (2) 2018.09.15
SDL Sprite Animation  (0) 2018.08.19
프레임과 FPS  (0) 2018.08.04
OpenGL Texture 그리기  (0) 2018.08.04
OpenGL IBO를 사용한 큐브 그리기  (0) 2018.07.22