E D R , A S I H C RSS

수직동기화

wait for Vertical Synchronization.

개요

그래픽 카드의 프레임 생성과 모니터의 프레임 출력 타이밍을 맞추도록 하는 설정. 수직동기화라고 부르며, 아날로그 영상 신호에서 프레임 시작을 나타내는 신호의 이름에서 유래하였다. 북미에서는 Vertical Synchronization을 줄인 V-Sync라고 부르기도 한다. 흔히 게임의 비디오 옵션에서 자주 보이는 V-Sync 옵션이 바로 수직동기화와 관련이 있다.

상세

수직동기 신호는 디스플레이의 가장 마지막에서 발생하여 가장 위쪽에서 종료된다. 그 다음에는 디스플레이 화면의 왼쪽에서 오른쪽으로, 위에서 아래로 화면을 그리며 내려와서, 다시 화면의 맨 아래쪽에서 새로운 수직동기 신호를 발생시킨다. 여기까지가 주로 1/60 초가 걸리게 된다. 그래서 대부분의 게임도 여기에 맞춰 1/60초에 한번씩 데이터를 계산하고 화면을 새로 그리게 된다.

느려짐 処理落ち

전술했듯 1/60초 단위로 수직동기를 대기하며 계산을 마치고 그림을 그린다. 그런데 만약 처리가 늦어져서 수직동기 신호를 놓치게 되면? 게임은 다음번 수직동기 신호까지 또 다시 대기를 해야 한다. 그러면 그 프레임에서는 결국 두 배인 1/30초를 소비하게 되는 것이다. 이런 처리 지연이 계속 이어지게 된다면 결국 플레이어는 게임이 느려지게 되는 현상을 경험하게 되는 것이다. 게임기의 성능을 넘어서는 적의 출현, 총알의 과다 표현 등으로 게임이 슬로모션으로 돌아가는 이유는 이 때문이다.

테어링

만약 수직동기가 되지 않은 상태에서 프레임의 생성을 프로그램에게 맡겨둔다면 어떤 일이 발생할까? 정해진 시간 없이 프레임이 과다 혹은 과소 생성되게되어 한 화면에 동시에 2-3개의 화면이 그려지게 되는 경우가 발생하게 될 것이다. 이런 상황에서 화면이 좌에서 우로 흐른다면? 서로 맞지 않는 그림들이 한 화면에 섞여져 나와 어긋나게 보여질 것이다. 이것을 테어링 이라고 한다.

현대의 흐름

텔레비전 게임기야 무조건 수직동기화가 기본이었기에 상관없는 이야기지만, 컴퓨터 게임의 경우엔 수직동기화를 켜는 것은 일종의 바보짓 같은 경우가 많았다. 예전 CRT 모니터가 널리 쓰일 때는 모니터의 주사율이 60Hz를 한참 넘기는 경우도 많았기 때문에[1] 수직동기화를 켜서 얻는 이익이 그리 크지 않았다. 오히려 수직동기화를 끄고 벤치마크를 돌려 초당 120 프레임을 관측하며 성능부심을 갖는 일이 흔했지만, 현재와 같이 60Hz짜리 LCD를 주로 쓰는 환경에서는 오히려 이를 쓰는 편이 테어링이 방지되어서 생기는 효과가 크다. 오히려 현대의 게임은 60프레임을 못내는 경우가 허다하기 때문에, 테어링을 막기 위해서라도 수직동기화를 켜는 것이 대부분이다.

NTSC 와 PAL

보통 디스플레이는 1/60 초로 화면을 갱신하지만 유럽쪽에 사용되는 PAL 같은 경우에는 1/50 초로 화면을 갱신한다. 그래서 과거에는 프로그램도 여기에 맞춰서 만들어야 할 필요가 있었다. 주로 1/60 초로 제작하고 6번에 한 번 그림을 그리지 않는 식으로 만들었는데, HD방송 시대가 오면서 대부분 1/60 초의 신호를 갖고 있기 때문에 고려하지 않아도 되었다고. PAL 게임을 NTSC에서 돌리면 게임이 1.2배 빨라진다거나 하는 현상을 볼 수 있다.

수직동기화의 장단점은 다음과 같다.
  • 장점
    • 테어링을 방지한다. 삼중버퍼링과 함께 사용하면 더욱 좋다.
    • 필요 이상의 과도한 화면 갱신을 막아주어 CPU와 GPU의 전력소모를 감소시킨다.
  • 단점
    • 반응속도를 억제시키기 때문에 민감한 사람에겐 60fps 고정으로도 인풋랙을 느낄 수 있다
----
  • [1] CRT 모니터의 감광체 특성 때문에 최초 85Hz 이상으로 맞추는 경우가 많았으며 고급 모니터와 그래픽 카드는 120Hz 이상도 지원하였다. 물론 사람이 120Hz를 제대로 인식할 수는 없지만 화면의 깜빡임을 줄이는 효과가 있었다. 반대로 60Hz로 맞추면 왠만큼 둔한 사람이 아니라면 화면의 깜빡임 때문이 눈이 엄청나게 피로해졌다.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2015-03-25 17:01:37
Processing time 0.0526 sec