삼중 버퍼링

 

1. 개요
2. 렌더링과 화면 출력이 분리된 삼중 버퍼링
3. 삼중 버퍼링 수직동기화
4. 관련 기술


1. 개요


Triple Buffering
컴퓨터 그래픽스에서 3개의 버퍼를 이용해 화면을 출력하는 기술.
연산 장치(CPUGPU 등)가 만들어낸 그래픽 데이터는 일단 메모리 상의 버퍼에 저장됐다가 화면에 출력되는 과정을 거친다. 이때 단일 버퍼만을 가지는 구조에서는 버퍼를 비우거나 갱신하는 도중에 화면이 출력되어 깜빡임이나 테어링(화면 엇물림)이 발생하기 쉬우므로 이를 완화하기 위해서는 다중의 버퍼가 필요하며 일반적으로는 이중 버퍼링이 사용되고 있다. 다중 버퍼링에서는 연산 장치가 데이터를 기록하는 버퍼를 백버퍼, 디스플레이에 직접 출력될 데이터가 기록되는 버퍼를 프론트버퍼라 한다.
모니터의 화면 갱신 주기마다 두 버퍼를 바꿔치기(스왑)하면 백버퍼 데이터였던 쪽은 프론트버퍼 데이터가 되어 화면에 출력되고, 프론트버퍼였던 쪽은 백버퍼가 되어 연산 장치가 다음 프레임의 데이터를 저장하게 됨으로써 부드러운 화면 전환이 가능해진다.
물론 이중 버퍼링에서도 GPU의 백버퍼 갱신 주기가 모니터 갱신 주기보다 너무 높거나 낮으면 갱신 중이던 백버퍼의 내용이 그대로 화면에 출력되는 문제가 생기므로 이를 해결하기 위해 수직동기화나 지싱크, 프리싱크 등의 기술이 이용되고 있다.
'''삼중 버퍼링'''도 이러한 문제를 해결하기 위한 방법으로 이중 버퍼링에 비해 백버퍼 하나를 더 쓰는 방식인데, 그 구동 원리가 다른 두 가지 방식이 각각 삼중 버퍼링이란 이름으로 불리고 있기 때문에 혼동을 피하고자 둘을 나눠서 설명한다.

2. 렌더링과 화면 출력이 분리된 삼중 버퍼링


이 방식에서 GPU는 매 프레임을 두 백버퍼에 쉬지 않고 번갈아가며 렌더링하기 때문에 어떤 순간에도 둘 중 한 버퍼에는 완전한 프레임이 저장돼 있는 상태가 유지된다. 모니터의 갱신 주기가 돌아와 프론트버퍼와 백버퍼를 바꿔치기해야 할 때가 오면, 가장 최근에 완성된 프레임이 저장된 쪽의 백버퍼만을 택함으로써 실제 화면에는 항상 테어링 없는 완전한 프레임만이 출력된다.
또한 GPU는 모니터의 갱신 주기를 기다릴 필요 없이 퍼포먼스의 한도 내에서 계속 2개의 백버퍼에 새 프레임을 찍어내기만 하면 되므로 입력 지연 시간이 현저하게 적다. 즉 이 방식은 테어링을 방지하면서, 수직동기화와 달리 입력 지연과 끊김을 어느 정도 방지하는 장점까지 가진다.
하지만 수직동기화와 달리 GPU 사용량을 제한하는 효과가 없기 때문에 과부하나 전력 사용 문제가 걱정된다면 주의가 필요하다. 또한 이 방식은 그 원리상 GPU가 모니터의 갱신 주기보다 충분히 높은 FPS를 뽑아낼 수 있을 때 의미가 있기 때문에 그렇지 못한 상황에서는 오히려 끊김이 일어나게 된다.
영문 위키백과아난드텍 등에 따르면 이쪽이 '원래 의미의', 혹은 '진짜' 삼중 버퍼링이라고 돼있는데, 특히 아난드텍에서는 이것 외의 다른 방식을 삼중 버퍼링이라 부르지 말 것을 권장하고 있지만 이에 관해서는 여러 주장이 엇갈리고 있다.
엔비디아의 파스칼 칩셋부터 도입된 '''패스트싱크'''(Fast Sync)라는 이름의 기술은 사실 이 삼중 버퍼링과 원리상 차이가 없다. 다만 엔비디아에서는 다음 항에서 설명하는 기술을 삼중 버퍼링이라고 해왔기 때문에 새롭게 이름을 붙인 것으로 보인다. 엔비디아는 시연회 당시엔 패스트싱크와 기존 수직동기화(VSync)를 비교하면서 다른 것으로 설명했지만, 현재 엔비디아 제어판에서 패스트싱크를 설정하려면 '수직동기' 옵션에서 '빠르게' 모드를 선택하도록 되어 있다. 물론 기존 수직동기화와는 구동 원리가 전혀 다름에도 불구하고 테어링을 없애는 방식을 통틀어 수직동기화라고 한다면 이것도 그의 일종으로 볼 수도 있겠지만, 아직 명확한 정의는 없어 보인다.


3. 삼중 버퍼링 수직동기화


역시 백버퍼가 2개라는 점에서는 같지만 이쪽은 기존의 수직동기화를 보조하는 정도의 기술이다. 수직동기화는 백버퍼 쓰기가 완료될 때까지 프론트버퍼를 갱신하지 않는데, 이 때문에 기존의 이중 버퍼링 구조로는 백버퍼에 렌더링하는 동안 수직동기를 놓치면 갱신율이 절반으로 떨어지는 문제가 있다. 이를 삼중 버퍼링으로 처리하면 여분의 백버퍼가 하나 더 있기 때문에 백버퍼 하나를 채웠으면 수직동기를 기다리지 않고 다른 백버퍼에 다음 프레임을 렌더링할 수 있다.
즉, 일부 프레임의 렌더링이 오래 걸리더라도 그만큼 미리 처리를 시작해 저장해 놓으므로 화면 갱신율이 반토막나는 현상을 어느 정도 막을 수 있다. 다만 두 버퍼를 모두 채우면 일반 수직동기화와 마찬가지로 다음 수직동기가 돌아올 때까지 렌더링하지 않고 대기하므로 그만큼의 입력 지연이 더 발생한다.
일반적으로 게임 자체 설정이나 드라이버 등에서 제공하는 삼중 버퍼링 기능은 이쪽을 의미한다. 참고로 수직동기화와 삼중 버퍼링을 각각 따로 설정할 수 있는 경우 수직동기화는 끄고 삼중 버퍼링만 켜는 것은 테어링 제거 효과가 없어 무의미하다.

4. 관련 기술


다음과 같은 특징이 있으며 아래 표의 용어를 설명하자면
  • 인풋렉: 입력도구(키보드, 마우스등)로 입력시 화면(모니터, TV등)에 반영(글자, 캐릭터의 움직임등)될때 지연시간
  • 주사율: 모니터 재생빈도(60hz,144hz등)
  • 테어링: 화면이 갈라져 보이는 현상
  • 마이크로 스터터링: 화면이 끊기거나 떨려보이는 현상
'''요소'''
'''장점'''
'''단점'''
수직동기화
GPU 사용량 제한(발열, 전력 감소), 테어링 제거, 마이크로스터터링 감소
인풋랙 증가, 프레임이 주사율 밑으로 떨어지면 프레임 반토막(예:60FPS->30FPS)
수직동기화+삼중버퍼링
GPU 사용량 제한(발열, 전력 감소), 테어링 제거, 마이크로스터터링 감소, 프레임이 주사율 밑으로 떨어지면 프레임 반토막 완화(프레임을 미리 2장 더 그려 놓음)
인풋랙 추가 증가
삼중 버퍼링(패스트싱크)
테어링 제거, 수직동기화에 비해 인풋렉 완화
GPU 사용량 제한 불가(발열, 전력 증가), 마이크로 스터터링 증가(프레임이 약간씩 떨려 보이며 프레임이 높든 적든 수직동기화보다 증가되고 프레임이 떨어지면 더 심해짐)
프레임제한
GPU 사용량 제한(발열, 전력 감소), 마이크로 스터터링 감소, 인풋랙 매우 적음(프레임별로 다르나 모든 수직동기화방식에 비해서 적음)
테어링 제거 불가(엔디비아 인스펙더등으로 하드웨어 수준에서 모니터의 재생빈도와 동일하게 프레임을 제한하면 불완전 제거가능)
동적 프레임제한[1]
GPU 사용량 제한, 스터터링 없음, 제한적인 마이크로스터터링감소, 인풋랙 적음
테어링 제거 불가
적응형 수직동기화
GPU 사용량 제한, 스터터링 없음, 제한적인 마이크로스터터링감소, 제한적인 테어링 제거
약간의 테어링 발생 가능성, 인풋랙 증가
추가로 인풋렉을 완전히 없애려면 어떠한 종류의 수직동기화도 사용하지 않아야 한다. 모든 수직동기화 방식(지싱크,프리싱크등등 모두 포함)은 화면 품질을 위해 길든 적든 대기시간을 갖기 때문에 수직동기화를 끈상태에 비해서 인풋렉이 있다. 실시간으로 경쟁하는 게임에서 수직동기화 끄고 최하옵션으로 플레이 하는 이유가 여기에 있다.
프레임이 높게 나올수록 인풋렉이 적어지며(FPS가 높을 수록 적어지며 200FPS이상부터는 효율이 떨어진다.) 일부 게임들은 엔진에 따라 프레임이 높거나, 특정 프레임에서만 가능한 버그나 비기가 있다.
(콜오브듀티는 특정 프레임에서 평소 못올라가는 곳도 올라가는 하이점프, 낙사 데미지 감소등이 가능하고 스카이림은 프레임이 높으면 물리엔진이 버그 난다.)
수직동기화 형태에 따른 입력 지연 시간의 변화는 다음 링크에서 확인할 수 있다. Reduce Input Lag in PC Games: The Definitive Guide
잘 알려지지 않은 사실이지만 Windows Aero도 삼중버퍼링을 사용한다. 이 때문에 에어로가 켜져 있으면 미세하게나마 인풋렉이 증가할 수 있다. 이를 방지하려면 에어로를 끄거나 프로그램을 전체화면으로 설정하면 된다. 다만 윈도우 8 이상의 경우 DWM을 끌 수 없기 때문에 전체화면 외에는 방법이 없다.

[1] 동적 프레임제한의 경우 Radeonpro를 통해 라데온만 사용할 수 있으며, Radeonpro를 사용하면 동적 수직동기화라는 지포스의 적응형 수직동기화와 동일한 기능을 사용할 수 있다.