1. 개요
Triple Buffering컴퓨터 그래픽스에서 3개의 버퍼를 이용해 화면을 출력하는 기술.
연산 장치( CPU나 GPU 등)가 만들어낸 그래픽 데이터는 일단 메모리 상의 버퍼에 저장됐다가 화면에 출력되는 과정을 거친다. 이때 단일 버퍼만을 가지는 구조에서는 버퍼를 비우거나 갱신하는 도중에 화면이 출력되어 깜빡임이나 테어링(화면 엇물림)이 발생하기 쉬우므로 이를 완화하기 위해서는 다중의 버퍼가 필요하며 일반적으로는 이중 버퍼링이 사용되고 있다. 다중 버퍼링에서는 연산 장치가 데이터를 기록하는 버퍼를 백버퍼, 디스플레이에 직접 출력될 데이터가 기록되는 버퍼를 프론트버퍼라 한다.
모니터의 화면 갱신 주기마다 두 버퍼를 바꿔치기(스왑)하면 백버퍼 데이터였던 쪽은 프론트버퍼 데이터가 되어 화면에 출력되고, 프론트버퍼였던 쪽은 백버퍼가 되어 연산 장치가 다음 프레임의 데이터를 저장하게 됨으로써 부드러운 화면 전환이 가능해진다.
물론 이중 버퍼링에서도 GPU의 백버퍼 갱신 주기가 모니터 갱신 주기보다 너무 높거나 낮으면 갱신 중이던 백버퍼의 내용이 그대로 화면에 출력되는 문제가 생기므로 이를 해결하기 위해 수직동기화나 지싱크, 프리싱크 등의 기술이 이용되고 있다.
삼중 버퍼링도 이러한 문제를 해결하기 위한 방법으로 이중 버퍼링에 비해 백버퍼 하나를 더 쓰는 방식인데, 그 구동 원리가 다른 두 가지 방식이 각각 삼중 버퍼링이란 이름으로 불리고 있기 때문에 혼동을 피하고자 둘을 나눠서 설명한다.
2. 렌더링과 화면 출력이 분리된 삼중 버퍼링 / 패스트싱크(Fast Sync)
OpenGL에서 삼중 버퍼링을 구현할 때 기본적인 방식. 이 방식에서 GPU는 매 프레임을 두 백버퍼에 쉬지 않고 번갈아가며 렌더링하기 때문에 어떤 순간에도 둘 중 한 버퍼에는 완전한 프레임이 저장돼 있는 상태가 유지된다. 모니터의 갱신 주기가 돌아와 프론트버퍼와 백버퍼를 바꿔치기해야 할 때가 오면, 가장 최근에 완성된 프레임이 저장된 쪽의 백버퍼만을 택함으로써 실제 화면에는 항상 테어링 없는 완전한 프레임만이 출력된다.또한 GPU는 모니터의 갱신 주기를 기다릴 필요 없이 퍼포먼스의 한도 내에서 계속 2개의 백버퍼에 새 프레임을 찍어내기만 하면 되므로 입력 지연 시간이 현저하게 적다. 즉 이 방식은 테어링을 방지하면서, 수직동기화와 달리 입력 지연과 끊김을 어느 정도 방지하는 장점까지 가진다.
하지만 수직동기화와 달리 GPU 사용량을 제한하는 효과가 없기 때문에 과부하나 전력 사용 문제가 걱정된다면 주의가 필요하다. 또한 이 방식은 그 원리상 GPU가 모니터의 갱신 주기보다 충분히 높은 FPS를 뽑아낼 수 있을 때 의미가 있기 때문에 그렇지 못한 상황에서는 특별한 장점이 없다.[1].
사실 가장 큰 장점은 게임 FPS 변동으로 모니터 주사율보다 높아졌다 낮아졌다 왔다갔다 하는 걸 무시하고 그냥 쓰면 된다는 점이다. 이중 버퍼링 수직 동기는 게임 FPS가 낮을 때, 다음 항에서 설명하는 방식은 게임 FPS가 모니터 주사율보다 높을 때 특별한 문제가 발생한다. 반면 이 방식은 게임 FPS가 낮을 때는 다음 항에서 설명하는 방식과 동등하게 끊김이 발생하며(이중 버퍼링 수직 동기보다 우월), 게임 FPS가 모니터 주사율보다 높을 때는 이중 버퍼링 수직 동기과 동등하게 끊김과 인풋랙을 유발한다(다음 항에서 설명하는 방식보다 우월). 어디까지나 '수직 동기화를 계속 유지한다' 전제 하에서 양쪽 상황을 모두 대응할 수 있는, 성능상 가장 완벽한 기술인 셈이다[2]. 물론 어디까지나 '수직 동기화를 계속 유지한다'는 한계 안에서만 그런 것이고, 그 뻔한 한계를 피하기 위해 '적응형 수직동기화'나 적응형 동기화가 나왔다.
영문 위키백과나 아난드텍 등에 따르면 이쪽이 '원래 의미의', 혹은 '진짜' 삼중 버퍼링이라고 돼있는데, 특히 아난드텍에서는 이것 외의 다른 방식을 삼중 버퍼링이라 부르지 말 것을 권장하고 있지만 이에 관해서는 여러 주장이 엇갈리고 있다.
엔비디아의 파스칼 칩셋부터 도입된 패스트싱크(Fast Sync)라는 이름의 기술은 사실 이 삼중 버퍼링과 원리상 차이가 없다. 다만 다이렉트3D 상에서 삼중 버퍼링을 그냥 구현하면 다음 항에서 설명하는 방식이 기본값이기 때문에, 소프트웨어 지원과 무관하게 구현을 새로 만든 거라 이름을 붙인 것이다. 소프트웨어 상에서는 수직 동기 없이 이중 버퍼 방식의 비동기로 그냥 출력하더라도, 지포스 그래픽카드 상에서는 두 개의 백버퍼를 교대로 쓰는 방식이다. 소프트웨어가 뭘 보고 있든 상관 없이 '렌더링과 화면 출력이 분리된 삼중 버퍼링'으로 작동하는 것.
3. 삼중 버퍼링 수직동기화
일반적으로 게임 자체 설정이나 드라이버 등에서 제공하는 삼중 버퍼링 기능은 이쪽을 의미하는데, 다이렉트 3D 기본 설정이기 때문이다. 참고로 수직동기화와 삼중 버퍼링을 각각 따로 설정할 수 있는 경우 수직동기화는 끄고 삼중 버퍼링만 켜는 것은 테어링 제거 효과가 없어 무의미하다.(다만 이론상으로는 100% 그래야하는데, 게임과 시스템에 따라 1% 하위 프레임이나 최저 프레임에 도움을 주는 황당한 경우(...)도 있어서 예외적인 케바케를 조심할 것)역시 백버퍼가 2개라는 점에서는 같지만 이쪽은 기존의 수직동기화를 보조하는 정도의 기술이다. 수직동기화는 백버퍼 쓰기가 완료될 때까지 프론트버퍼를 갱신하지 않는데, 이 때문에 기존의 이중 버퍼링 구조로는 백버퍼에 렌더링하는 동안 수직동기를 놓치면 갱신율이 절반으로 떨어지는 문제가 있다. 이를 삼중 버퍼링으로 처리하면 여분의 백버퍼가 하나 더 있기 때문에 백버퍼 하나를 채웠으면 수직동기를 기다리지 않고 다른 백버퍼에 다음 프레임을 렌더링할 수 있다.
즉, 일부 프레임의 렌더링이 오래 걸리더라도 그만큼 미리 처리를 시작해 저장해 놓으므로 화면 갱신율이 반토막나는 현상을 어느 정도 막을 수 있다. 다만 두 버퍼를 모두 채우면 일반 수직동기화와 마찬가지로 다음 수직동기가 돌아올 때까지 렌더링하지 않고 대기하므로 그만큼의 입력 지연이 더 발생한다.
4. 관련 기술
수직동기화 문서의 관련 기술 부분을 확인
[1]
오히려 끊김이 일어나게 된다는 다소 misleading인데, 이 끊김은 티어링을 감수하고 화면을 바로 갱신하지 않는 이상 무조건 발생하는 한계이기 때문이다. 이걸 피하려면 적응형 동기를 통해 근본적인 게임의 룰 자체를 바꾸거나, 모니터 주사율을 무식하게 높여서 타이밍이 애매한 시점 자체를 줄이는 수밖에 없지 애초에 수직 동기화 내에서 논할 사항이 아니다! 그나마 모니터의 갱신 주기 2배 이상의 FPS를 전제로 이 문제를 피해갈 수 있다는 점은 삼중 버퍼링의 제한적인 장점이지, 안 되는 게 당연한 상황을 기준으로 단점이라 하는 것은 호도이다. 적응형 동기도 비슷한 타이밍 출돌이 생기면 끊김과 인풋랙이 발생한다(단, 이쪽은 구현 원리 자체가 다른만큼 반대로 FPS가 모니터 주사율보다 약간 높을 때 가장 심하다)
[2]
다만 이론과 달리 실제로는 이중 버퍼링 수직 동기는 멀쩡한데, 패스트 싱크만 스터터링이 생기는 황당한 경우(...)도 있어서 예외적인
케바케를 조심할 것