IT인벤 팁과강좌 게시판

전체보기

모바일 상단 메뉴

본문 페이지

[개념정리] 수직동기화

아이콘 Zamin
댓글: 7 개
조회: 19309
2012-06-28 14:23:58
전에도 어디 장황이 썼었던 적이 있는데...

수직동기화, 티어링에 대하여 지극히 심한 오해가 널리 퍼져 있어서 써봅니다.


아주 잘 설명해놓은글을 링크합니다.



이하 모든 이미지는 아난드텍 에서 가져옵니다.


디스플레이는 일반적으로 이중버퍼링을 사용합니다.



단일 버퍼의 경우 물체가 갱신되면 화면갱신시 그 물체에 떨림이 발생하는 심각한 문제가 존재하여 

이제 모든 디스플레이는 이중버퍼를 사용합니다.


저 위에 보시듯 백버퍼에 컴퓨터는 화면을 부어넣습니다. 

여기서 모니터는 일정 주기로 화면을 갱신 - 즉 백버퍼와 프론트 버퍼를 바꿉니다. 이것이 리프레쉬 레이트 입니다.

그리고 백버퍼와 프론트버퍼의 전환은 내용을 복사하는게 아니라 이름을 바꾸는 겁니다.



컴퓨터가 백버퍼에 화면을 쓰는 중에 백버퍼와 프론트 버퍼가 스왑됩니다...

이러면 이전의 백버퍼 내용 - 즉 과거의 화면과 지금 보여주려는 화면이 섞이게 됩니다.

이상태가 화면에 출력될경우 화면이 위 아래 부분별로 깨지게 되며 이를 티어링 이라 부릅니다.


찡가님의 이글루 블로그, 화면 상단의 잘린줄이 보입니다.





설명을 읽어보시면 아시겠지만

티어링의 발생은 FPS와는 아무 상관이 없습니다. FPS가 설혹 1 이라고 하더라도 

이 화면이 백버퍼로 컴퓨터가 쓰는중에 버퍼스왑이 되면 티어링이 발생합니다.

( 다만 FPS가 커지면 커질수록 백버퍼로 쓰는 횟수가 늘어나게 되므로 티어링이 발생할 확률은 증가합니다.

또한 FPS가 작으면 그 화면이 오래 지속되므로 티어링 발발시 더 눈에 밟히게 됩니다.

일반적으로 티어링이 가장 덜 거슬리는 FPS는 화면 주사율과 같을때 라고 합니다.)



여기서 수직동기화 기술이 등장합니다.



먼저 화면이 생성되면 컴퓨터는 버퍼가 스왑되기를 기다립니다.

버퍼가 스왑되면 직후 이 화면을 백버퍼로 씁니다. 그리고 다음화면을 그립니다.

이 기다리는 동안 화면을 생성하지 않기 때문에 GPU가 놀게 되는것입니다.

그리고 지연출력되기 때문에 당연히 인풋렉이 생길수 밖에 없습니다.



A가 화면이 갱신되는 타이밍이라면 B가 백버퍼에 쓰는 순간

그리고 숫자가 생성되는 화면이라고 합시다.



A-------A-------A-------A-------A-------A-------A
               B          B           B           B           B
    1           2           3           4            5            6
A-------A-------A-------A-------A-------A-------A
                         |                  
                         |-> ㄱ


수직동기화의 경우 여기서 ㄱ의 순간 우리가 보게되는 화면은 [1] 이 되는겁니다.
([1]이 버퍼로 전송되는것이  한 프레임 밀려서 전송되는것이, 지연출력되는것이 보이실겁니다.)

이것이 수직동기화시 인풋렉이 생기는 요체입니다.

그리고 이러한 동기화를 어떤 주기로 하느냐에 따라 FPS가 고정됩니다.

리프레쉬 레이트 와 주기를 일치시킬경우 [리프레쉬 레이트 = FPS] 

2번 리프레쉬 할때마다로 주기가 일치 될경우 [리프레쉬 레이트 / 2 = FPS]
(한번 건너 뛰는 경우)

3번 리프레쉬 할때마다로 주기가 일치 될경우 [리프레쉬 레이트 / 3 = FPS]
(두번 건너 뛰는 경우)

.....

일반적인경우 60, 30, 20, 15, 12, 10,... 으로 FPS가 고정되는거죠




이 지연출력의 문제는 일반적인 미디어의 재생에 있어서는 거의 문제가 없지만

일부 게임과 같이 인터엑션이 빠르게 이루어지는 경우 심각한 인풋렉문제로 대두되어 

이를 해결하기 위해 고안된 기술이 삼중버퍼링입니다.





위에서 보시듯 백버퍼를 2개 쓰는겁니다.

(백버퍼와 프론트 버퍼 사이에 또다른 버퍼를 놓는게 아닙니다.)


하나의 백버퍼를 쓰는동안 이 버퍼를 락을 겁니다....

그리고 버퍼에 모두 쓰고나면 락을 풀고 다음 버퍼에 쓸때는 이전과 다른 버퍼에 씁니다...

버퍼 스왑시에는 락이 걸려있지 않는 버퍼와 스왑합니다...


이렇게 되면 지연출력되지 않으므로 이론상 인풋렉은 존재 하지 않습니다...



다만 3중버퍼링에서 유의할것은

스왑이 한차례이루어진후 다음 스왑이전까지 백버퍼의 갱신이 완료되지 않았을 경우입니다.

(일반적으로 생성되는 화면의 갯수가 리프레쉬레이트보다 낮을경우같이 FPS가 충분히 높지 못할경우 입니다.)


만일 이 상황에서 백버퍼가 갱신되고 있다면 이는 락이 걸려 있으므로 

버퍼 스왑이 이루어지지 않습니다.

즉 화면이 스킵됩니다. (즉 스킵된 화면은 전부 티어링이 일어나는 화면입니다. 사람이 인지하든 못하든요)

이것이 3중 버퍼링시 FPS가 하락하는 원인입니다.




다음이 Anadtech에서 가져온 결과물의 예입니다.


2중 버퍼링 : 일반적인 상황에서 티어링이 발생



일반적인 수직동기화 : 한프레임씩 밀어서 늦게 보여주면서 티어링 제거


3중 버퍼링 수직동기화 : 일반적인 상황과 거의 같은타이밍의 화면을 보여주면서 티어링 제거






요약 :

티어링의 발생

FPS와 상관없이 FPS가 낮든 높든 무조건 발생한다. 
FPS가 매우 높을때와 매우 낮을때 모두 심각하게 눈에 거슬린다...
대게 60FPS 일때 가장 쾌적하다
(일반 60Hz LCD 모니터 에서)


수직동기화를 직관적으로 쉽게 이해하는법


수직동기화는 일반 상황에서 
화면을 한박자씩 늦게 출력시켜서 티어링을 없애는 기술이다.


3중버퍼링 수직동기화는 일반 상황에서 
티어링되는 화면만 골라내서 빼내는 기술이다.


(실제로는 구현방법에 따라 일반상황에서 티어링이 일어날 상황에서 이걸 빼내는 경우와 

정상화면으로 보여주는 경우 모두 존재하지만 직관적으로 저렇게 이해하시면 쉽습니다.)




첨언


1. 화면옵션 조절등을 통해 60FPS전후로 나오도록 세팅하는것이 가장 좋다.


2. 화질에 신경을 쓰는 사람이라면 어떤 상황에서든 필히 삼중버퍼링 수직동기화를 키자...
 
    (이경우 그래픽카드의 메모리 소요가 증가하는것에도 신경써야 한다.)



Lv77 Zamin

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징

최근 HOT한 콘텐츠

  • 견적
  • 게임
  • IT
  • 유머
  • 연예