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


특히 지도에서 지점을 선택하는 부분이 스크롤 뷰로 되어 있는데 마우스 휠로 천천히 스크롤하면 안 그러는데 마우스 클릭해서 빠르게 스크롤하면 화면이 찢어지는 것처럼 보인다
에디터나 이렇게 촬영이나 화면 녹화로는 잘 안보이는데 게임을 플레이할 때는 눈에 거슬릴 정도로 심함.. 짤로 잘 안보여서 아쉽
이를 찾아보니 이와 같은 현상을 스크린 티어링이라고 하더라
게임에서 스크린 티어링이란 GPU가 화면에 출력하는 속도와 화면의 새로고침 주기가 동기화되지 않을 때 발생하는 시각적 문제라고 한다
우치의 경우 지도에서 스크롤을 내릴 때 화면이 한 번에 갱신되지 않고 한 프레임과 다음 프레임이 겹쳐보여 화면의 위쪽과 아래쪽이 서로 다른 시점의 프레임을 보여주는 것처럼 보인다
화면을 천천히 움직일 때는 괜찮지만 빠르게 움직이면 티어링이 두드러지게 보인다
스크린 티어링이 언제 발생하냐면
그래서 GPU와 모니터의 성능을 어느정도 맞추는 것이 좋다
이 스크린 티어링을 해결하기 위한 가장 널리 알려진 방법은 수직 동기화, V-Sync(Vertical Synchronization)이다
수직 동기화는 GPU가 렌더링 하는 속도와 모니터가 화면을 새로고침하는 빈도를 동기화하는 기술이다. 수직 동기화를 활성화하면 GPU는 모니터가 화면을 새로고침 한 후에 새로운 프레임을 버퍼에서 가져와 화면에 출력한다
수직 동기화를 통해 스크린 티어링을 방지하고 화면의 주사율에 맞춰 일정 속도로 프레임을 출력해 부드러운 화면을 경험할 수 있음
반면 수직 동기화로 인해 발생하는 단점은
유니티에서는 수직 동기화를 설정할 수 있는 부분이 있다
Edit > Project Setting에서 Quality로 가보자

옵션을 살펴보면
우치는 현재 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을 꺼봤다
Application.targetFrameRate = 60; // 60FPS로 제한
비교해보니까 별 차이 없는 것 같다
지금까지 와서 진단한 문제는 최적화를 해야 할 것 같다. 프레임 드랍이 좀 있다...
아예 최적화 관련해서 새로운 글을 써봐야겠다