[Unity] 수직동기화(VSync)

0시0분·2024년 2월 14일
0

Unity

목록 보기
15/19

우주하마 - 힐링게임인척 하는 빡종겜ㄷㄷ반전의 반전의 레전드 낚시
https://www.youtube.com/watch?v=6Hewo1IprZg

평화롭게 유튜브를 보던 중에 재밌는 영상을 발견했다.

영상 중반쯤부터 수직동기화 옵션에 따라 우주선의 속도가 달라지는 것을 볼 수 있는데,
이유가 뭔지 궁금해졌다.

수직동기화는 내게 그저 게임 옵션 중 하나일 뿐, 이게 뭘 변화시키는지는 궁금해하지 않았었는데
이 기회에 제대로 이해해보려 한다.

수직동기화란?

✏️ '수직' 동기화인 이유
모니터가 위에서 아래로, 왼쪽에서 오른쪽으로 그려지는데
왼쪽에서 오른쪽으로 한 줄 작업이 끝나면 수평 동기 신호를,
위에서 아래로 전체 작업이 끝나면 수직 동기 신호를 발생시킨다.
이때 발생한 '수직 동기 신호'에 맞춰 모니터를 갱신하는 것을 '수직동기화' 라 한다.

모니터가 화면을 그리는 속도에 맞춰 그래픽카드의 성능을 제한하는 것.

그래픽카드는 '버퍼'에 다음 모니터에 그려질 화면을 미리 그린다.
모니터는 일정 시간마다 '버퍼'에 그려진 내용을 가져다가 화면에 출력한다.

그런데 그래픽카드가 일을 너무 열심히 해서 모니터가 미처 그려진 화면을 가져가기 전에
'버퍼'위에 새로운 그림을 그려버리면 테어링 현상이 발생한다.

테어링 (Tearing)
디스플레이 기기의 영상은 지속적으로 업데이트되지 않고 Unity 프레임 업데이트 방식과 유사하게 정기적인 간격으로 업데이트됩니다. 하지만 Unity 업데이트는 디스플레이 업데이트와 동기화되지 않을 수 있으므로 디스플레이가 아직 이전 프레임을 렌더링하는 동안 Unity가 새 프레임을 제공할 수 있습니다. 그러면 화면에서 프레임이 변경되는 포지션에 "테어링"이라는 시각적 결함이 발생합니다.

테어링을 시뮬레이션한 예. 확대된 부분에 그림의 변화가 분명히 보입니다.
디스플레이 기기가 업데이트되지 않는 “수직 블랭크”라는 기간에만 프레임을 전환하도록 Unity를 설정할 수 있습니다. Quality 설정의 V Sync Count 옵션을 사용하여 프레임 전환을 기기의 수직 블랭크와 동기화하거나 하나 거른 수직 블랭크와 동기화하도록 설정할 수 있습니다. 후자는 게임에서 프레임 렌더링을 완료하기 위해 두 번 이상의 기기 업데이트가 필요한 경우 유용할 수 있습니다.
(출처 - 유니티 공식문서 https://docs.unity3d.com/kr/2021.2/Manual/class-QualitySettings.html)

그려져있던 그림 위에 새 그림이 반쯤 그려진 상태로 모니터에 출력이 되는 것이다.

따라서 이를 방지하기 위해 그래픽카드가 모니터가 '버퍼'의 내용을 출력한 이후에만
그림을 그릴수 있도록 제한하는 것이 수직동기화다.

단점 1) 스터터링(Stuttering)
처리가 늦어져서 수직동기 신호를 놓치게 되면 게임은 다음번 수직동기 신호까지 또 다시 대기를 해야 한다. 그러면 그 프레임에서는 결국 두 배인 1/30초를 소비하게 되는 것이다. 이런 처리 지연이 계속 이어지게 된다면 결국 플레이어는 게임 자체가 느려지는 현상을 경험하게 된다.
수직 동기화는 수직 동기된 프레임 수에서 떨어지면 강제로 프레임이 1/2로 낮아진다. 예를 들어 10ms마다 갱신되는 화면이 있다고 가정하자. 그러면 FPS는 100인데(1000(ms)/10(ms)=100(FPS)), 처리 지연이 걸려 11ms만에 다음 화면을 그리게 된다면, 10ms로 '동기화'가 되어 있는 출력부에서는 불완전한 해당 프레임을 내보내느니 그냥 내보내지 않는 것을 택한다. 그러면 전 프레임과 다음 프레임의 간격은 20ms가 되는데, 이 상황에서의 순간 FPS는 50이 되는 것{1000(ms)/20(ms)=50(FPS)}. 그래서 끊김(스터터링: stuttering)이 발생한다.
(출처 - https://thewiki.kr/w/%EC%88%98%EC%A7%81%EB%8F%99%EA%B8%B0%ED%99%94)
👉 그래픽카드가 그림을 다 그리기 전에 모니터가 가져가겠다고 하면 거절해버리는 현상. 그래서 한 신호 쉬고 다음 신호에 가져가게 됨! 뚝뚝 끊기는 현상
단점 2) 인풋렉 (Input Lag)
입력장치를 이용하여 신호를 넣었을 때 그 결과가 모니터에 나타나는 데에 까지 걸리는 시간을 측정하는 것. 이와 비슷한 개념인 '응답속도'는 모니터가 얼마나 빠르게 이미지를 보여주느냐를 의미하는데, 결국 모니터의 반응이 빨라야 인풋렉이 줄어드는 셈이므로 인풋렉의 범주 안에 들어가는 개념이다.
(출처 - https://m.blog.naver.com/benq4ever/220937856155)


그럼 우주하마는 왜..?



수직동기를 껐다가 켰는데 왜 움직임이 나아졌을까.

사실.. 잘 모르겠다.
켜져있었다가 끈거라면 인풋렉이 발생했었거나.. 스터터링이 발생했거나 하는 추측이 될 것 같은데
꺼져있었다 켰는데 상태가 나아졌다?

보통 컴퓨터 성능이 게임에 비해 넉넉하면 수직 동기화를 켜는 것을 추천한다고 하는데
이는 그래픽카드의 불필요한 연산을 줄이기 위한 개념이 아닌가 싶다.
갑자기 우주선이 빨라지는 것과는 상관이 없는 것 같은데..

아니면 오히려 우주하마가 처음 플레이 하던 속도가 정상적이었던게 아닐까?
🤨
나중에라도 알게되면 다시 글을 써야겠다..


👀 https://coolenjoy.net/bbs/37/123538?sfl=wr_subject&stx=%EC%88%98%EC%A7%81&sop=and
👀 https://docs.unity3d.com/kr/2021.2/Manual/class-QualitySettings.html
👀 https://velog.io/@paenge1004/TIL-Unity-%EC%88%98%EC%A7%81%EB%8F%99%EA%B8%B0%ED%99%94VSync-day-71
👀 https://jhnambi.tistory.com/18

0개의 댓글