나무모에 미러 (일반/어두운 화면)
최근 수정 시각 : 2023-10-21 23:34:25

삼중 버퍼링

1. 개요2. 렌더링과 화면 출력이 분리된 삼중 버퍼링 / 패스트싱크(Fast Sync)3. 삼중 버퍼링 수직동기화4. 관련 기술

1. 개요

Triple Buffering

컴퓨터 그래픽스에서 3개의 버퍼를 이용해 화면을 출력하는 기술.

연산 장치(CPUGPU 등)가 만들어낸 그래픽 데이터는 일단 메모리 상의 버퍼에 저장됐다가 화면에 출력되는 과정을 거친다. 이때 단일 버퍼만을 가지는 구조에서는 버퍼를 비우거나 갱신하는 도중에 화면이 출력되어 깜빡임이나 테어링(화면 엇물림)이 발생하기 쉬우므로 이를 완화하기 위해서는 다중의 버퍼가 필요하며 일반적으로는 이중 버퍼링이 사용되고 있다. 다중 버퍼링에서는 연산 장치가 데이터를 기록하는 버퍼를 백버퍼, 디스플레이에 직접 출력될 데이터가 기록되는 버퍼를 프론트버퍼라 한다.

모니터의 화면 갱신 주기마다 두 버퍼를 바꿔치기(스왑)하면 백버퍼 데이터였던 쪽은 프론트버퍼 데이터가 되어 화면에 출력되고, 프론트버퍼였던 쪽은 백버퍼가 되어 연산 장치가 다음 프레임의 데이터를 저장하게 됨으로써 부드러운 화면 전환이 가능해진다.

물론 이중 버퍼링에서도 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. 관련 기술

다음과 같은 특징이 있으며 아래 표의 용어를 설명하자면
요소 장점 단점
수직동기화 GPU 사용량 제한(발열, 전력 감소), 테어링 제거, 마이크로스터터링 감소 인풋랙 증가, 프레임이 주사율 밑으로 떨어지면 프레임 반토막(예:60FPS->30FPS)
수직동기화+삼중버퍼링 GPU 사용량 제한(발열, 전력 감소), 테어링 제거, 마이크로스터터링 감소, 프레임이 주사율 밑으로 떨어지면 프레임 반토막 완화(프레임을 미리 2장 더 그려 놓음) 인풋랙 추가 증가
삼중 버퍼링(패스트싱크) 테어링 제거, 수직동기화에 비해 인풋렉 완화 GPU 사용량 제한 불가(발열, 전력 증가), 마이크로 스터터링 증가(프레임이 약간씩 떨려 보이며 프레임이 높든 적든 수직동기화보다 증가되고 프레임이 떨어지면 더 심해짐)
프레임제한 GPU 사용량 제한(발열, 전력 감소), 마이크로 스터터링 감소, 인풋랙 매우 적음(프레임별로 다르나 모든 수직동기화방식에 비해서 적음) 테어링 제거 불가(엔비디아 인스펙더등으로 하드웨어 수준에서 모니터의 재생빈도와 동일하게 프레임을 제한하면 불완전 제거가능), AMD 오피셜로 프리싱크 알고리즘과 충돌하여 병행사용 비권장
동적 프레임제한[3] - 라데온 전용 GPU 사용량 제한, 스터터링 없음, 제한적인 마이크로스터터링감소, 인풋랙 없음 찢김 제거 불가
적응형 수직동기화[4][5] - 지포스 전용 GPU 사용량 제한, 스터터링 없음, 제한적인 마이크로스터터링감소, 제한적인 찢김 제거 약간의 찢김 발생 가능성, 인풋랙 증가
향상된 수직동기화[6] - 라데온 전용 스터터링 없음, 제한적인 마이크로스터터링감소, 제한적인 찢김 제거 약간의 찢김 발생 가능성

추가로 인풋렉을 완전히 없애려면 어떠한 종류의 수직동기화도 사용하지 않아야 한다. 모든 수직동기화 방식(지싱크,프리싱크등등 모두 포함)은 화면 품질을 위해 길든 적든 대기시간을 갖기 때문에 수직동기화를 끈상태에 비해서 인풋렉이 있다. 실시간으로 경쟁하는 게임에서 수직동기화 끄고 최하옵션으로 플레이 하는 이유가 여기에 있다.

프레임이 높게 나올수록 인풋렉이 적어지며(FPS가 높을 수록 적어지며 200FPS이상부터는 효율이 떨어진다.) 일부 게임들은 엔진에 따라 프레임이 높거나, 특정 프레임에서만 가능한 버그나 비기가 있다.
(콜오브듀티는 특정 프레임에서 평소 못올라가는 곳도 올라가는 하이점프, 낙사 데미지 감소등이 가능하고 스카이림은 프레임이 높으면 물리엔진이 버그 난다.)

수직동기화 형태에 따른 입력 지연 시간의 변화는 다음 링크에서 확인할 수 있다. Reduce Input Lag in PC Games: The Definitive Guide

잘 알려지지 않은 사실이지만 Windows Aero도 삼중버퍼링을 사용한다. 이 때문에 에어로가 켜져 있으면 미세하게나마 인풋렉이 증가할 수 있다. 이를 방지하려면 에어로를 끄거나 프로그램을 전체화면으로 설정하면 된다. 다만 윈도우 8 이상의 경우 DWM을 끌 수 없기 때문에 꽤 오랫동안 전체화면 외에는 방법이 없다. 이를 해결하는 플립 프리젠테이션 기술이 윈도우 10 업데이트로 도입되었으나, GPU와 그래픽드라이버, 윈도우, 프로그램이 모두 이를 지원하고 활성화해야 완전한 효과를 내는데 사용자가 확인할 수 없다(...). 그나마 윈도우 11의 기본 그래픽 설정에서는 '창 게임에 대한 최적화'란 이름으로 나와서 제어할 수 있다. 오토 HDR 기능에 필요해서 생긴 설정인데, 그나마 설명 문서를 보면 '사용할 수 있습니다', '게임이 호환되는 경우'라는 사용자가 일일이 확인할 수 없는 단서를 달아놨다(...)


[1] 오히려 끊김이 일어나게 된다는 다소 misleading인데, 이 끊김은 티어링을 감수하고 화면을 바로 갱신하지 않는 이상 무조건 발생하는 한계이기 때문이다. 이걸 피하려면 적응형 동기를 통해 근본적인 게임의 룰 자체를 바꾸거나, 모니터 주사율을 무식하게 높여서 타이밍이 애매한 시점 자체를 줄이는 수밖에 없지 애초에 수직 동기화 내에서 논할 사항이 아니다! 그나마 모니터의 갱신 주기 2배 이상의 FPS를 전제로 이 문제를 피해갈 수 있다는 점은 삼중 버퍼링의 제한적인 장점이지, 안 되는 게 당연한 상황을 기준으로 단점이라 하는 것은 호도이다. 적응형 동기도 비슷한 타이밍 출돌이 생기면 끊김과 인풋랙이 발생한다(단, 이쪽은 구현 원리 자체가 다른만큼 반대로 FPS가 모니터 주사율보다 약간 높을 때 가장 심하다)[2] 다만 이론과 달리 실제로는 이중 버퍼링 수직 동기는 멀쩡한데, 패스트 싱크만 스터터링이 생기는 황당한 경우(...)도 있어서 예외적인 케바케를 조심할 것[3] RadeonPro(소프트웨어)를 통해 라데온만 사용할 수 있으며, 지포스의 적응형 수직동기화와 유사한 기능이다.[4] Adaptive V-Sync, 적응형 동기화(Adaptive Sync)와 헷갈리지 않도록 하자. 사실 적응형 수직동기화가 먼저 나온 기술이다.[5] FPS > 모니터 주사율일 때만 수직동기를 켜고, FPS가 낮을 때는 끄는 간단한 기술이다.[6] Enhanced Sync, 적응형 수직동기화처럼 FPS > 모니터 주사율일 때만 수직동기를 켜고, FPS가 낮을 때는 끄는 간단한 기술이다. 다만 수직동기를 켤 때 삼중 버퍼링(패스트싱크)으로 작동하는 게 다르다.