왜 60hz 모니터에서 40, 45프레임이 망가질까?

게임 프레임이 30에서 40으로 올라가면 화면도 그만큼 부드러워져야 할 것 같은데 막상 보면 더 거칠게 느껴질 수가 있습니다. 숫자는 높아졌는데 화면에서는 무슨 일이 벌어지는지 궁금해서 60Hz 모니터에 게임 프레임이 올라가는 과정을 코드로 직접 옮겨 봤어요.

프레임 26만 장씩 돌려 보니 30프레임은 모든 프레임이 33.3ms 동안 똑같이 머물렀고, 40프레임은 16.7ms와 33.3ms가 번갈아 나온 것이 이번 실험의 결과였습니다. 아래에서 과정과 결과를 자세히 알아보시죠!

30프레임은 정상이었다

화면에 프레임이 머문 시간의 표준편차를 재 보니 30프레임은 0ms였는데요. 40프레임은 8.3ms, 45프레임은 7.9ms였고, 50프레임도 6.7ms로 30프레임보다 훨씬 들쭉날쭉했어요. 59프레임은 2.2ms까지 줄었는데, 프레임 가운데 1.7%가 두 번씩 머무는 탓이었죠.

초당 한 번쯤 화면이 한 박자 쉬는 셈이라고 할 수 있습니다. 60프레임은 물론 0ms였어요. 59프레임이 60에 가장 가까운데도 0이 아니라는 점이 눈에 띄었는데요. 높은 프레임이 항상 더 고른 화면을 주는 건 아니었습니다.

화면은 16.7ms마다 한 번 변한다

60Hz 모니터는 1초에 60번, 16.7ms 간격으로만 화면을 바꿉니다. 위키백과의 가변 주사율 항목을 읽어 보면, 고정 주사율에서는 갱신 시점에 다음 프레임이 준비되어 있지 않을 때 이전 장면이 그대로 남고 그게 끊김으로 이어진다고 말합니다.

그 규칙을 그대로 코드에 담아냈습니다. 수직동기를 켠 상태에서 게임이 프레임을 일정한 간격으로 내놓고, 갱신 시각마다 그때까지 완성된 가장 최근 프레임을 올리는 방식이죠. 프레임이 완성되는 시각은 갱신 주기 안에서 무작위로 어긋나게 잡았습니다. 간격이 일정할 때는 수식으로 구한 값과 시뮬레이션 결과가 일치한다는 결과를 얻을 수 있었습니다.

40과 45는 이렇게 쪼개졌다

40프레임은 프레임 간격이 25ms인데 화면은 16.7ms 단위로만 바뀌니, 한 프레임이 두 번 보이고 다음 프레임은 한 번만 보이는 일이 계속 되풀이됐습니다. 평균으로는 25ms인데 실제로 눈에 들어오는 건 16.7ms짜리와 33.3ms짜리 장면이 번갈아 바뀌는 리듬입니다. 45프레임은 한 번, 한 번, 두 번 순서였는데요.

처음에는 프레임 시간이 흔들리면 결과가 크게 달라질 줄 알았습니다. 프레임 간격에 15% 흔들림을 줘 봤는데 40프레임의 머문 시간은 16.7ms가 50.3%, 33.3ms가 49.5%로 일정할 때와 거의 동일했고, 45프레임에서는 0.3%의 프레임이 화면에 한 번도 오르지 못했습니다. 간격이 흔들리는지보다 간격이 16.7ms로 나눠떨어지는지가 더 큰 문제였죠.

60Hz에서 프레임레이트별 화면에 머문 시간 편차 비교

24프레임 영화도 같은 패턴?

영화 필름의 24프레임을 60Hz 영상으로 옮길 때도 같은 일이 생깁니다. 60을 24로 나누면 2.5라서 한 장면에 두 칸이나 세 칸을 번갈아 줘야 하는데요. 위키백과의 3:2 풀다운 항목에는 한 장면을 3번, 다음 장면을 2번 번갈아 보여 주는 방식이라고 나와 있고, 그 불균일이 저더(judder)를 만든다고 합니다.

이번 계산에서 24프레임은 두 번과 세 번이 반반 나왔고 표준편차는 8.3ms였어요. 40프레임의 8.3ms와 같은 값입니다. 필자의 생각으로는 이 결과에서 가장 의외인 숫자는 30프레임의 0.0이었습니다. 15, 20, 30, 60프레임은 모두 거의 0으로 나왔으니, 문제는 낮은 프레임이 아니라 60으로 나눠떨어지지 않는 프레임이었던 겁니다.

120Hz로 바꾸면 달라졌다

같은 조건에서 주사율만 바꿔 봤습니다. 120Hz에서는 40프레임이 모두 세 번씩 머물러 표준편차가 사실상 0이 됐어요. 45프레임은 3.9ms로 60Hz의 7.9ms에서 절반쯤 내려갔고, 144Hz에서는 40프레임이 3.4ms, 45프레임이 2.8ms였습니다.

120Hz에서 40프레임이 고른 건 120이 40의 정확히 세 배라서입니다. 가변 주사율은 프레임이 준비되면 그때 화면을 바꾸는 방식이라고 하지만 이번에는 다루지 않았습니다. 다만 이 실험은 수직동기를 켠 상태만 가정했고, 게임이 프레임을 정확한 간격으로 내놓는다는 가정에다 티어링과 입력 지연, 실제로 사람이 느끼는 거슬림은 재지는 못했습니다. 결론적으로, 40, 45프레임이 망가져 보이는 이유는 프레임 간격이 모자라서가 아니라, 그 간격(25ms와 22.2ms)이 16.7ms 단위로 나눠떨어지지 않아서였습니다.

댓글 남기기