2012년의 Kepler와 GTX 680 이후로, GPU 개발에서 NVIDIA의 side projects들 중 하나는 input lag를 줄이는 방법들을 고안하는 것이다. NVIDIA의 뛰어나고 (그리고 다재다능한 front man) Tom Petersen 엔지니어의 조심스러운 시야아래에서, 그 회사는 그 문제를 다루기 위해 몇년 간 두 개의 다른 기술들을 도입했다. Kepler는 adaptive v-sync를 도입했다 - 그 frame rate가 refresh rate아래로 내려갈 때, v-sync를 동적으로 비활성화하는 능력이다. 그리고 2013년에 물론, 그 회사는 그들의 G-sync variable refresh rate technology를 도입했다.
그 때 이후로, Tom의 team은 v-sync의 규칙을 바꿀 또 다른 방법을 아직 작업 중이다. Pascal과 관련된 것은 NVDIA가 Fast sync라고 부르는 새로운 v-sync 모드이다. 그리고 v-sync를 유지하면서 input lag를 줄이는 또 다른 방법을 제안하도록 설계되었다.
Fast Sync가 완전 새로운 아이디어가 아니라, 오히려 오래된 아이디어의 현대의 그리고 좀 더 일관적인 태도라는 것을 주목하는 것이 흥미롭다 : triple buffering. 현대에서, triple buffering은 순차적인 frame queue로서 작동하는 3개의 내부 버퍼인데, 몇 게임들과 비디오 카드들은 triple buffering은 조금 다르게 처리했다. 3개의 버퍼들을 순차적인 queue로서 사용하기 보다는, 그것들은 대신에 항상 가장 오래된 buffer에 덮어쓰곤 했다. 이 작은 변화는 input lag에 잠재적으로 중요한 변화를 가졌었다. 그리고 만약 너가 old school triple buffering과 친숙하다며 너는 어디에서 이것이 발생하는지를 안다.
Fast Sync로, NVIDIA는 driver level에서 old school triple buffering을 구현했고, 또 다시, 현대의 그리픽 카드로 사용가능하게 만들었다. Fast Sync를 구현하는 목적은 refresh rate보다 더 높은 frame rate를 만들 수 있는 현대의 게임에서 input lag를 줄이기 위해서 인데, NVIDIA는 구체적으로 CS:GO과 다른 그래픽적으로 간단한 twitch games들을 타겟으로 한다.
그러나 어떻게 Fast Sync가 실제로 input lag를 줄이는가? 이것을 좀 더 들어가기 위해, 내가 아래에서 작성한 2009년의 old school triple buffering에 좋은 글이 있다. 7년 후에, 그 이름을 제외하고 기술적 세부사항은 여전히 NVIDIA의 Fast Sync 구현과 정확하다.
What are Double Buffering, V-sync, and Triple Buffering
한 컴퓨터가 한 모니터에 어떤 것을 display하길 원할 때, 그것은 그 스크린이 어떻게 보내져야 하는지의 그림을 그리고, (우리가 한 버퍼라고 부를) 이 사진을 모니터에게 보낸다. 옛날시절에, 오직 한 개의 버퍼가 있었고, 그것은 지속적으로 모니터에게 그려지고 보내지는 둘 다가 되었다. 이 접근법에 몇 가지 이점들이 있지만, 매우 큰 단점들이 있다. 가장 뚜렷하게, display에 있는 objects들이 업데이트 될 때, 그것들은 종종 깜빡 거린다.
그 같은 buffer에 drawing하는 동안 reading하는 것의 문제와 싸우기 위해, 최소한 double buffering이 이용된다. double buffering 뒤에 있는 아이디어는 그 컴퓨터가 오직 한 버퍼에만 ("back" buffer라고 불려지는) 그리고 그 다른 버퍼를 ("front" buffer라고 불려지는) 것을 스크린에 보낸다. 그 컴퓨터가 그 back buffer를 다 그리고나서, 그 drawing을 하는 그 프로그램은 buffer "swap"이라고 불려지는 것을 한다. 이 swap은 어떠한 것도 움직이게 하지 않는다 : 그 두 버퍼들의 이름만 바꾼다: 그 front buffer가 back buffer가 되고, back buffer가 front buffer가 된다.
buffer swap 이후에, 그 software는 새로운 back buffer에 그리기 시작할 수 있고, 그리고 그 컴퓨터는 그 다음 buffer swap이 발생할 때 까지 그 모니터에 새로운 front buffer를 보낼 수 있다.
double buffering의 이 형태에서, 한 swap은 언제든지 발생할 수 있다. 그것은 그 컴퓨터가 모니터에 데이터를 보내는 동안, 그 swap이 발생할 수 있다는 것을 의미한다. 이것이 발생할 때, 그 스크린의 나머지는 그 새로운 front buffer가 포함하는 것을 따라 그려진다. 만약 그 새로운 front buffer가 이전의 front buffer와 충분히 다르다면, "tearing" 이라고 알려진 visual artifact가 보일 수 있다. 이러한 유형의 문제는 갑자기 빠르게 움직일 때의 high framerate FPS 게임들에서 종종 보일 수 있다. 빠른 움직임 때문에, 모든 frame은 매우 다르고, drawing하는 동안 한 swap이 발생할 때, 그 불일치는 크고, 산만해질 수 있다.
tearing과 싸우는 가장 흔한 접근법은 그 monitor가 또 다른 image가 준비될 때 까지 swap buffers를 기다리는 것이다. 그 모니터는 완전히 그것에게 보내진 것을 그리고, 다음 vertical refresh cycle이 시작하려 한 후에 준비가 된다. Vertical refresh로 buffer swaps를 Synchronizing하는 것은 V-sync라고 불려진다.
V-sync를 활성화 하는 것은 tearing을 고치지만, 그것은 또한 게임의 내부 frame rate를 최대 monitor의 refresh rate로 설정한다 (일반적으로 대부분의 LCD panels에 대해 60Hz). 이것은 비록 그 게임이 60 FPS로 작동하지 않을지라도, 성능에 해를 줄 수 있다. 동기화 효과를 위해 추가된 인공적인 지연이 여전히 있을 것이기 때문이다. 성능은 모든 프레임이 16.67ms (1초의 1/60)보다 더 길게 걸리는 half cases 경우에 거의 줄어들 수 있다. 그러한 경우에, frame rate는 그 게임이 60 FPS로 작동해야 한다는 사실에도 불구하고, 30FPS로 떨어질 것이다. 그러나, tearing의 제거와, framerate의 일관성은 V-sync 없는 double buffering이 보여줄 수 없는 추가된 부드러움에 기여한다.
Input lag(입력 지연)은 V-sync가 활성화 되었을 때 좀 더 문제가 된다. 이것은 왜냐하면 도입된 artificial delay(인공 지연)이 실제로 발생했을 때 (그 프레임이 그려지고 있을 때)와 그것이 스크린에 보일 때 사이의 차이를 증가시키기 때문이다. Input lag는 항상 존재하지만 (스크린에 현재 발생하는 것을 즉각적으로 그리는 것은 불가능하다), 그 trick은 그것을 최소화하는 것이다.
double buffering으로 우리가 가진 옵션들은 V-sync없이 tearing같은 가능한 visual problems와 부정적으로 성능에 영향을 미치고, V-sync가 활성화되어 input lag를 증가시킬 수 있는 artificial delay 사이의 선택이다. 그러나 걱정할 것 없이, quality or actual performance에서 희생없이 두 개의 세계의 최상의 것들을 합치는 옵션이 있다. 그 옵션은 triple buffering이다.
그 이름은 많은 것을 준다 : triple buffering은 두개 대신에 세 개의 버펃르을 사용한다. 이 추가적인 버퍼는 그 컴퓨터에게 한 버퍼가 모니터에 보내지는동안 그 버퍼가 locked 되도록 유지할 충분한 space를 제공한다 (tearing을 피하기 위해서). 또한 그 소프트웨어가 그것이 가급적인 가능한 빠르게 그리는 것을 방해하지 않도록 하면서 (심지어, 한 개의 locked buffer와 함께, 그 소프트웨어가 앞 뒤로 bounce할 수 있는 두 개가 여전히 있다). 그 소프트웨어는 그 두 개의 back buffers 사이에 앞뒤로 그리고, refresh마다, 그 front buffer는 가장 최근에 완료되어 완전히 렌더링된 프레임을 포함한 back buffer에 대해 swapped 된다. 이 것은 그래픽 카드의 메모리에서 추가 공간을 잡아먹지만, 적어도 현재 그래픽카드가 512MB를 가지면서, 이 추가 공간은 더 이상 실제 문제가 아니다.
다시 말해서, triple buffering으로, 우리는 정확히 같은 높은 실제 성능을 얻고, V-sync가 비활성화된 설정의 비슷한 감소된 input lag를 얻는다. 그리고 동시에 visual quality를 얻고, V-sync가 활성화되었을 때의 부드러움을 얻는다.
그러나, 그 소프트웨어가 triple buffering할 때, 두 개의 back buffers에 scenes 뒤의 전체 시간 동안 여전히 그리고 있다는 것을 주목해라. 이것은 그 front buffer swap이 발생할 때, double buffering과 V-sync와 ㄷ르게, 우리는 artificial delay가 없다는 것을 의미한다. V-sync가 없는 double buffering과 다르게, 우리가 한 완전히 렌더링된 프레임을 모니터에게 보낸다면, 우리는 중간에 다른 프레임으로 바꾸지 않는다.
Fast Sync의 최종 결과는 v-sync와 input lag에 관련하여, 올바른 케이스들에서 우리가 효과를 볼 수 있다는 것이다. v-sync가 꺼진 것 처럼 끊임없이 프레임들을 렌더링하고, 그러고나서 가장 최근의 frame을 잡고, 나머지를 버려서, Fast Sync는 v-sync가 발생시키는 전통적으로 높은 input lag 없이 tearing을 방지하기 위해 v-sync가 여전히 사용될 수 있다는 것을 의미한다.
실제의 input lag benefits은 몇 가지 요인들에 의존할 것인데, frame rates와 display refresh rates를 포함한다. 그 최소한의 input lag는 한 프레임을 그리는데 걸리는 시간의 양이다 - v-sync가 꺼진 것처럼 - 그러고나서 너는 실제로 그 프레임을 display하기 위해서 다음 refresh interval를 기다려야만 한다. 평균의 법칙 덕분에, 그 frame rate가 높을 수록 (렌더링 시간이 짧을 수록), 한 프레임이 screen refresh 직전에 준비되는 odds(?)가 더 좋아지는데, 이것은 input lag의 평균량을 줄여준다. 이것은 frame draws사이의 완전한 16.7ms와 전통적인 double buffered setup이 있는 경우에 60Hz displays에 특히 해당한다.
NVIDIA의 예제 수치들은 높은 speed camera를 가진 CS:GO를 모니터링하여 얻어졌다. 나는 이러한 수치들을 확인할 수 없다 - 최대한의 마케팅 노력으로, 그것은 best-case scenario일 수 있다 - 그러나, 그들의 chart가 비합리적인 것은 아닌데, 특히 만약 그들의 v-sync example이 3-deep buffer를 사용한다면. Input lag는 v-sync 없이 더 높을 것이지만, v-sync를 켜는 것 보다 더 낮다 (잠재적으로 훨씬 그렇다). 결국, 최대한의 장점은 매우 높은 프레임율인데, 이것은 NVIDIA가 CS:GO 같은 게임들을 타게팅한 이유이다. refresh rate보다 더 높은 frame rate * times은 최상긔 결과를 만들기 때문이다.
위에서 말해진 것과 함께, 나는 Fast Sync가 순수하게 input lag에 관한 것이고, 부드러움(smoothness)을 다루지 않는다는 것에 주목할 것이다. 사실, 그것은 덜 smooth하게 만들지도 모르는데, 왜냐하면 그것은 본질적으로 frames을 떨어뜨리기 때문이다. frames 사이의 simulation time의 양은 변할 수 있다. 그러나, 높은 프레임율로, 이것은 문제가 되지 않을 것이다. 한 편, Fast Sync는 v-sync의 전력을 아끼는 이점 모두를 잃는 것을 의미한다; 프레임 사이에 쉬고 시간이 지나는 기회를 가지는 GPU보다는, 그것은 이제 full speed로 전체 시간동안 v-sync가 꺼진 것처럼 렌더링하고 있다.
마지막으로, Fast Sync가 NVIDIA의 다른 input lag reduction 기술과 어떻게 맞는지 명확히하는 것은 아마 유용하다. Fast Sync는 Adaptive V-Sync 또는 G-Sync를 대체하지 않지만, 오히려 그것들을 보상한다.
- Adaptive V-Sync : framerates가 refresh rate보다 낮을 때, v-sync를 선별적으로 비활성화 하여, input lag를 낮춘다.
- G-Sync : 한 프레임이 준비 되었을 때, 그 display의 maximum refresh rate까지 screen을 refresh하여, input lag를 줄인다.
- Fast Sync : framerate가 그 display의 refresh rate를 넘을 때 GPU를 지연시키지 않고 input lag를 줄인다.
Fast Sync는 구체적으로 frame rates가 display의 refresh rate를 초과할 때의 경우를 다룬다. 만약 그 frame rate가 refresh rate보다 낮다면, 그러면 Fast Sync는 아무것도 하지 않는다. 왜냐하면 그것은 시작할 single frame을 렌더링하는데 한 refresh interval보다 더 걸리기 때문이다. 그리고 이것은 대신에 Adaptive Sync가 들어오는 곳이다. 만약 바란다면.
한 편, G-Sync와 함께 할 때, Fast Sync는 그 frame rate가 그 display의 maximum refresh rate를 초과할 때에만 중요해진다. 대부분의 G-Sync 모니터에 대해, 이것은 120-144Hz이다. 이전에 max refresh rate보다 높은 G-sync 옵션들은 tear하거나 (no v-sync) 또는 GPU를 대기시키는데 (v-sync), 그래서 이것은 또한 G-Sync에 대해 tear-free input lag option을 제공한다.
댓글 없음:
댓글 쓰기