[Unity] 유니티 수직 동기화 / 스크린 티어링(Screen Tearing)

조재훈·2024년 11월 29일

개요

브릿지에서 진행중인 우치 프로젝트를 노트북에서 빌드하면 저번부터 그랬는데 화면이 뭔가 이상했다

오버워치 티어링

특히 지도에서 지점을 선택하는 부분이 스크롤 뷰로 되어 있는데 마우스 휠로 천천히 스크롤하면 안 그러는데 마우스 클릭해서 빠르게 스크롤하면 화면이 찢어지는 것처럼 보인다

에디터나 이렇게 촬영이나 화면 녹화로는 잘 안보이는데 게임을 플레이할 때는 눈에 거슬릴 정도로 심함.. 짤로 잘 안보여서 아쉽

이를 찾아보니 이와 같은 현상을 스크린 티어링이라고 하더라

스크린 티어링

게임에서 스크린 티어링이란 GPU가 화면에 출력하는 속도와 화면의 새로고침 주기가 동기화되지 않을 때 발생하는 시각적 문제라고 한다

우치의 경우 지도에서 스크롤을 내릴 때 화면이 한 번에 갱신되지 않고 한 프레임과 다음 프레임이 겹쳐보여 화면의 위쪽과 아래쪽이 서로 다른 시점의 프레임을 보여주는 것처럼 보인다

화면을 천천히 움직일 때는 괜찮지만 빠르게 움직이면 티어링이 두드러지게 보인다

스크린 티어링이 언제 발생하냐면

  • GPU 프레임 레이트 > 디스플레이 주사율
    • 화면이 한 번 새로고침 되기 전 GPU가 여러 프레임을 전송하므로 서로 다른 두 프레임이 화면에 나타남
  • GPU 프레임 레이트 < 디스플레이 주사율
    • 모니터가 새로운 프레임을 기다리지 못하고 이전 프레임 데이터를 중간에 교체해버리면서 발생

그래서 GPU와 모니터의 성능을 어느정도 맞추는 것이 좋다

이 스크린 티어링을 해결하기 위한 가장 널리 알려진 방법은 수직 동기화, V-Sync(Vertical Synchronization)이다

수직 동기화(V-Sync)

수직 동기화는 GPU가 렌더링 하는 속도와 모니터가 화면을 새로고침하는 빈도를 동기화하는 기술이다. 수직 동기화를 활성화하면 GPU는 모니터가 화면을 새로고침 한 후에 새로운 프레임을 버퍼에서 가져와 화면에 출력한다

수직 동기화를 통해 스크린 티어링을 방지하고 화면의 주사율에 맞춰 일정 속도로 프레임을 출력해 부드러운 화면을 경험할 수 있음

반면 수직 동기화로 인해 발생하는 단점은

  • 입력 지연 : GPU가 모니터의 새로고침 주기를 기다려야 하므로 사용자 입력에 대한 반응이 느려질 수 있음
    • 우치에서는 입력이 많지 않아 괜찮지만 입력이 중요한 롤이나 배그같은 게임에선 치명적일듯
  • 프레임 드랍과 Stuttering
    • GPU가 주사율에 맞는 속도로 프레임을 생성하지 못할 경우, 프레임 속도가 갑자기 떨어질 수 있어 화면이 끊겨보일 수 있다
  • 리소스 낭비
    • 성능이 좋은 그래픽 카드가 더 많이 일할 수 있음에도 불구하고 제한되므로 낭비가 발생할 수 있음

유니티

유니티에서는 수직 동기화를 설정할 수 있는 부분이 있다

Edit > Project Setting에서 Quality로 가보자

옵션을 살펴보면

  • Don't Sync(0) : 수직 동기화를 비활성화한다
  • Every V Blank(1) : 모니터 주사율에 맞춰 동기화한다(60Hz -> 60FPS)
  • Every Second V Blank(2) : 주사율의 절반으로 동기화한다(60Hz -> 30FPS)

우치는 현재 2번째 옵션이 되어 있어서 빌드하면 원래 같으면 티어링이 안나야 정상인데 나고 있다..

코드에서도 이를 동적으로 바꿀 수 있는데 이를 이용해 세팅에서 수직 동기화를 켜고 끌 수도 있을 것 같다

QualitySettings.vSyncCount = 1; // Every V Blank

QualitySettings.vSyncCount = 0; // Disable V-Sync

수직 동기화대신 게임의 프레임을 제한하기 위해서는 다음의 한 줄이 필요하다

Application.targetFrameRate = 60; // 60FPS로 제한

이 코드를 넣으면 수직 동기화 옵션은 꺼줘야 한다. 그리고 프로파일링할 때는 수직동기화를 웬만하면 끄고 하라고 한다

플랫폼 별 설정으로 PC에서는 VSync Count를 설정하는 것으로 충분하지만 추가적인 G-Sync 또는 FreeSync를 지원하는 경우 추가 동기화를 활성화할 수 있음

모바일에서는 V-Sync 대신 GPU의 프레임 속도와 디스플레이 속도가 이미 동기화되어 있는 경우가 많아 targetFrameRate을 통해 설정하는 경우가 많다

해결방법

그래서 이 티어링을 해결하는 방법을 여러가지 해보자

해상도 변경

내 노트북은 1920 * 1080이라 전체 화면 시 티어링이 가장 심하고 해상도를 낮출수록 티어링이 거의 발생하지 않고 부드럽게 스크롤이 됐다

한 이 정도 크기 쯤이 부드럽다. 암튼 해상도가 높아질수록 문제가 발생한 것을 확인

VSync 비활성화

게임을 시작할 때 다음으로 프레임을 의도적으로 지정해주고 VSync을 꺼봤다

Application.targetFrameRate = 60; // 60FPS로 제한

비교해보니까 별 차이 없는 것 같다

지금까지 와서 진단한 문제는 최적화를 해야 할 것 같다. 프레임 드랍이 좀 있다...

아예 최적화 관련해서 새로운 글을 써봐야겠다

profile
나태지옥

0개의 댓글