프로그래밍/단어장

수직 동기화(V-Sync), 화면 찢김, 스터터링, 삼중 버퍼링

Lou Park 2024. 12. 22. 12:30

주사율과 프레임률

주사율은 화면 재생 빈도(Refresh Rate)라고도 하며, 모니터가 1초동안 화면을 몇 번 갱신하는지를 말한다. 단위로는 Hz를 사용하며 144Hz는 1초에 화면을 144단계로 쪼개서 보여줄 수 있다는 의미다. CRT 모니터에서는 이를 수직 재생 빈도 또는 수직 주파수라고 부른다.

 

프레임 속도(Frame Rate)또는 프레임률은 디스플레이 장치가 화면 하나의 데이터를 표시하는 속도를 말한다. 픽셀들로 이루어진 하나의 정지된 이미지를 "프레임"이라고 부르는데, 프레임률은 이러한 이미지들이 1초에 몇번 보이는지를 말한다. 단위는 fps(Frames per second)를 사용한다.

 

주사율은 동일한 프레임을 반복하는 회수를 포함하여 나타내므로, 60fps 영상을 120Hz 디스플레이에서 는 동일한 프레임을 2번 보여주는 것으로 표시된다. 따라서 주사율은 매번 새로운 이미지를 재생하는 경우에는 프레임률과 같으나, 동일한 이미지를 반복하는 경우에는 프레임률보다 커진다.

 

화면 찢김(테어링, Tearing) 현상

테어링 현상 (https://github.com/ValveSoftware/Source-1-Games/issues/627)


그렇다면 테어링은 어떻게 일어나는 것일까? 결론부터 말하자면 프레임률과 주사율이 크게 상이할때 발생한다. 한줄 한줄 인쇄하는 옛날 잉크 프린터기를 생각해보자. A라고 되어있는 이미지를 보면서 한줄 한줄 A를 그리고 있는 와중~에 갑자기 이미지가 B라고 바뀌어버린 것이다. 프린터는 그냥 B를 처리한다...

프린터가 출력한 결과물

A와 B가 합쳐진 요상한 문자가 그려졌다. 모니터 화면은 수평 주사선을 따라 좌상단부터 우하단까지 가로줄을 그리는 방식으로 그려진다. 이를 래스터 스캔(Raster Scan)방식이라고 한다.

 

게임에서 'FPS 보기' 옵션을 켜보면 알겠지만, 플레이하는 모든 구간에서 FPS가 일정하게 나오지는 않는다. 어떤 부분에서는 프레임이 떨어지고, 어떤 부분에서는 프레임이 치솟는다. 어느 구간에서 모니터의 주사율을 넘어가는 FPS가 나오고 이후에 FPS가 떨어지게되면 화면이 출렁이게되며 테어링이 발생하게된다.

 

수직 동기화(V-Sync)

수직 동기화를 켜면 화면 주사율과 프레임률을 맞춰준다. 그래픽 카드가 다음 프레임을 내보내기전에 화면 재생 주기가 끝나길 기다린 후 내보내게 된다. "완벽해! 그럼 항상 수직 동기화를 켜면되겠어!"라고 생각할 수 있지만, 수직 동기화는 게이머라면 이게 뭔지는 몰라도 거부감이 들정도로 악명이 자자한 녀석이다. 바로 수직 동기화를 인풋랙(Input Lag)과 스터터링(Stuttering)이 발생할 수 있기 때문이다.

 

모니터가 화면을 다 그리길 기다리느라 예전 이미지가 보이니 내 입력보다 한발짝 늦게 느껴지게 되는 것이 인풋렉이다. 스터터링은 모니터의 최대 주사율보다 프레임이 떨어질때 발생하는데, 이때 수직동기화는 프레임을 최대 주사율의 절반으로 고정시켜버리는데서 문제가 발생한다. 60fps 게임에서 60Hz 모니터로 게임을하고있는데, 사양이 약간 부족해서 56fps정도를 소화해버리자 30fps로 고정시켜버려 사용자는 버벅임을 느끼게된다. 따라서 사양이 충분하다면 수직 동기화를 켜는 것이 좋은 옵션이 될 수 있지만, 아닐경우에는 불편함을 겪을 수 있다.

 

지싱크(G-Sync)와 프리싱크(FreeSync)

G-Sync는 엔비디아가 개발한 적응형 화면 동기화 기술로, 모니터의 주사율과 그래픽 카드가 뽑아내는 프레임률을 일치하도록 제어함으로서 테어링은 물론, 인풋랙과 스터터링을 방지한다. 이는 모니터에서 G-Sync를 지원해야만 사용할 수 있다. FreeSync도 AMD에서 개발한 G-Sync과 유사한 기능이다.

 

프레임 제한

게임에서 프레임 제한 옵션은 수직 동기화와는 또 다른 개념이다. 프레임 제한을 해두면 수직 동기화의 발생 요건을 살펴보았을때, 프레임이 오버해서 생기는 테어링 현상을 막을 수 있지만, 주사율보다 프레임이 떨어져서 생기는 스터터링은 막지 못한다.

 

수직 동기화에서의 삼중 버퍼링(Triple Buffering)

삼중 버퍼링은 말처럼 3개의 버퍼를 이용해 화면을 출력하는 기술이다.

수직 동기화를 적용할때 삼중 버퍼링을 적용할지 말지 선택할 수 있다.

버퍼와 이중 버퍼링
버퍼는 그래픽카드가 그린 이미지를 임시로 저장하는 메모리 공간이다. 요즘 출력 장치들은 프론트 버퍼와 백 버퍼의 이중 버퍼링을 사용한다. 프론트 버퍼는 화면에 실제로 표시되는 이미지를 저장하는 버퍼이며, 이 이미지가 표시되는 동안 그래픽카드는 백 버퍼에 다음 프레임을 렌더링해두고, 화면 갱신 주기에 둘을 교체하는 방식이다. 

 

하지만 이중 버퍼링도 주사율과 프레임률이 크게 상이할 경우 마찬가지로 테어링, 스터터링과 인풋랙이 발생할 가능성이 있다. 삼중 버퍼링은 여기에 두번째 백 버퍼인 프리백 버퍼(Pre-Back Buffer)하나를 더 둔다. 이전에 수직 동기화를 켜면 프레임이 떨어질때 프레임률이 절반으로 떨어지는 현상이 생길 수 있다고 했는데, 삼중 버퍼링을 켜두면 이 현상을 어느정도 방지할 수 있다.

 

 

참고자료

https://news.lgdisplay.com/2022/02/%EB%94%94%EC%8A%A4%ED%94%8C%EB%A0%88%EC%9D%B4-%EC%83%81%EC%8B%9D%EC%82%AC%EC%A0%84/
https://ko.wikipedia.org/wiki/%ED%99%94%EB%A9%B4_%EC%9E%AC%EC%83%9D_%EB%B9%88%EB%8F%84
https://ko.wikipedia.org/wiki/%ED%94%84%EB%A0%88%EC%9E%84_%EB%A0%88%EC%9D%B4%ED%8A%B8
https://namu.wiki/w/%EC%88%98%EC%A7%81%EB%8F%99%EA%B8%B0%ED%99%94
https://blog.naver.com/PostView.nhn?blogId=gaf0zero&logNo=140170445220
https://namu.wiki/w/%EC%82%BC%EC%A4%91%20%EB%B2%84%ED%8D%BC%EB%A7%81