다중 버퍼링

[thumb|320px|세트 '''1''', '''2''', '''3'''은 각각 [스크린 테어링#수직 동기화|수직 동기화(vsync)가 활성화된 상태에서 단일, 이중, 삼중 버퍼링의 작동을 나타낸다. 각 그래프에서 시간은 왼쪽에서 오른쪽으로 흐른다. **3**은 3개의 버퍼가 있는 스왑 체인을 보여주며, 삼중 버퍼링의 원래 정의는 프레임 D가 완료되는 즉시 프레임 C를 버리고 지연 없이 버퍼 1에 프레임 E를 그리기 시작하는 것이다. 세트 **4**는 프레임(이 경우 B)을 그리는 데 평소보다 오래 걸릴 때 발생하는 현상을 보여준다. 이 경우 프레임 업데이트를 놓치게 된다. 비디오 재생과 같이 시간에 민감한 구현에서는 프레임 전체가 누락될 수 있다. 세트 **5**의 3개 버퍼 스왑 체인을 사용하면 프레임 A가 비디오 메모리에 복사될 때까지 기다리지 않고 프레임 B의 그리기를 시작할 수 있으므로, 지연된 프레임이 수직 되돌리기를 놓칠 가능성을 줄여준다.]]

컴퓨터 과학에서 **다중 버퍼링**(multiple buffering)은 "저자"에 의해 생성되는 자료의 부분적으로 업데이트된 버전 대신 "판독자"가 완전한(비록 오래되었을 수 있지만) 버전의 자료를 볼 수 있도록 하나 이상의 버퍼를 사용하여 자료 블록을 보관하는 것이다. 이는 컴퓨터 디스플레이 이미지에 매우 흔히 사용된다. 또한 판독자와 저자가 서로 다른 장치일 때 듀얼 포트 램(DPRAM)을 사용할 필요가 없도록 하는 데에도 사용된다.

## 설명
### 이중 버퍼링 페트리 네트
그림의 페트리 네트는 이중 버퍼링을 보여준다. 트랜지션 W1과 W2는 각각 버퍼 1과 2에 쓰는 것을 나타내고, R1과 R2는 각각 버퍼 1과 2에서 읽는 것을 나타낸다. 시작 시에는 트랜지션 W1만 활성화된다. W1이 실행된 후에는 R1과 W2가 모두 활성화되어 병렬로 진행될 수 있다. 이들이 끝나면 R2와 W1이 병렬로 진행되는 방식이다.

W1이 단독으로 실행되는 초기 과도기 이후, 이 시스템은 주기적이며 트랜지션은 항상 쌍으로(각각 R1과 W2, R2와 W1) 활성화된다.

thumb|이중 버퍼링 페트리 네트|center
## 컴퓨터 그래픽스에서의 이중 버퍼링
컴퓨터 그래픽스에서 **이중 버퍼링**(double buffering)은 끊김, 테어링 및 기타 아티팩트가 적게 나타나도록 그래픽을 그리는 기술이다.

프로그램이 픽셀이 두 번 이상 변하지 않도록 디스플레이를 그리는 것은 어렵다. 예를 들어, 텍스트 페이지를 업데이트할 때 이전 글자에는 사용되었지만 새 글자에는 사용되지 않는 픽셀만 어떻게든 지우는 것보다 전체 페이지를 지우고 글자를 그리는 것이 훨씬 쉽다. 그러나 이 중간 이미지는 사용자에게 깜빡임으로 보이게 된다. 또한 컴퓨터 모니터는 가시적인 비디오 페이지를 지속적으로 다시 그리므로(전통적으로 초당 약 60회), 완벽한 업데이트조차 "새" 이미지와 아직 다시 그려지지 않은 "이전" 이미지 사이의 수평 구분선으로 일시적으로 보일 수 있는데, 이를 테어링이라고 한다.

### 소프트웨어 이중 버퍼링
이중 버퍼링의 소프트웨어 구현은 모든 그리기 작업의 결과를 시스템 RAM의 일부 영역에 저장하며, 이러한 영역을 종종 "백 버퍼"(back buffer)라고 부른다. 모든 그리기 작업이 완료된 것으로 간주되면 전체 영역(또는 변경된 부분만)이 비디오 램(전면 버퍼, "front buffer")으로 복사된다. 이 복사는 대개 테어링을 피하기 위해 모니터의 래스터 빔과 동기화된다. 소프트웨어 이중 버퍼링 구현은 백 버퍼를 위해 할당된 시스템 메모리, 복사 작업 시간, 동기화 대기 시간 때문에 단일 버퍼링보다 필연적으로 더 많은 메모리와 CPU 시간을 필요로 한다.

영상합성 창 관리자는 창을 배치하고, 크기 조절이나 왜곡 효과로 변형하고, 부분을 투명하게 만드는 데 사용되는 "영상합성" 작업과 "복사" 작업을 결합하는 경우가 많다. 따라서 "전면 버퍼"에는 화면에 보이는 합성된 이미지만 포함될 수 있는 반면, 각 창마다 전체 창 내용의 합성되지 않은 이미지를 포함하는 별도의 "백 버퍼"가 존재한다.

### 페이지 플리핑
페이지 플립(page-flip) 방식에서는 자료를 복사하는 대신 두 버퍼를 모두 디스플레이할 수 있다. 어느 한 시점에 한 버퍼는 모니터에 의해 능동적으로 표시되고 있으며, 다른 배경 버퍼에는 그림이 그려진다. 배경 버퍼가 완성되면 두 버퍼의 역할이 바뀐다. 페이지 플립은 일반적으로 비디오 디스플레이 컨트롤러의 하드웨어 레지스터(비디오 메모리 내 디스플레이 자료의 시작 지점을 가리키는 포인터 값)를 수정함으로써 이루어진다.

페이지 플립은 자료를 복사하는 것보다 훨씬 빠르며, 모니터의 수직 귀선 기간(비디오 자료가 그려지지 않는 빈 기간) 동안 페이지가 전환되는 한 테어링이 발생하지 않음을 보장할 수 있다. 현재 활성화되어 보이는 버퍼를 **전면 버퍼**(front buffer)라고 하며, 배경 페이지를 **백 버퍼**(back buffer)라고 한다.

## 삼중 버퍼링
컴퓨터 그래픽스에서 **삼중 버퍼링**(triple buffering)은 이중 버퍼링과 유사하지만 향상된 성능을 제공할 수 있다. 이중 버퍼링에서 프로그램은 다음 그리기를 시작하기 전에 완료된 그림이 복사되거나 교체될 때까지 기다려야 한다. 이 대기 시간은 몇 밀리초가 될 수 있으며, 그 동안 두 버퍼 모두 손댈 수 없다.

삼중 버퍼링에서 프로그램은 두 개의 백 버퍼를 가지며, 이러한 복사에 관여하지 않는 버퍼에 즉시 그리기를 시작할 수 있다. 세 번째 버퍼인 전면 버퍼는 모니터에 이미지를 표시하기 위해 그래픽 카드가 읽는다. 이미지가 모니터로 전송되면, 전면 버퍼는 가장 최근에 완료된 이미지를 보관하고 있는 백 버퍼와 교체(또는 복사)된다. 백 버퍼 중 하나는 항상 완료된 상태이므로 그래픽 카드는 소프트웨어가 완료될 때까지 기다릴 필요가 없다. 결과적으로 소프트웨어와 그래픽 카드는 완전히 독립적이며 각자의 속도로 실행될 수 있다. 마지막으로, 표시되는 이미지는 동기화를 기다리지 않고 시작되었으므로 지연 시간이 최소화된다.

소프트웨어 알고리즘이 모니터 새로 고침 이벤트를 위해 그래픽 하드웨어를 폴링하지 않기 때문에, 알고리즘은 하드웨어가 렌더링할 수 있는 한 빠르게 추가 프레임을 계속해서 그릴 수 있다. 새로 고침 간격보다 훨씬 빨리 완료되는 프레임의 경우, 복사하기 전에 백 버퍼의 프레임을 최신 반복으로 여러 번 교체하는 것이 가능하다. 이는 후속 프레임에 의해 덮어씌워지기 전에 전혀 사용되지 않는 프레임이 백 버퍼에 기록될 수 있음을 의미한다. 엔비디아는 이 방식을 "패스트 싱크"(Fast Sync)라는 이름으로 구현했다.

때때로 삼중 버퍼링이라고 불리는 대안적인 방법은 길이가 3인 스왑 체인이다. 프로그램이 두 백 버퍼를 모두 그린 후에는, 다른 백 버퍼를 그리기 전에 첫 번째 버퍼가 화면에 배치될 때까지 기다린다(즉, 이것은 길이가 3인 선입 선출 큐이다). 대부분의 윈도우 게임은 삼중 버퍼링을 활성화할 때 이 방식을 언급하는 것으로 보인다.

## 사중 버퍼링
**사중 버퍼링**(quad buffering)이라는 용어는 입체 영상 구현에서 왼쪽 눈과 오른쪽 눈 이미지 각각에 이중 버퍼링을 사용하는 것을 의미하며, 따라서 총 4개의 버퍼가 사용된다(삼중 버퍼링을 사용한다면 6개의 버퍼가 된다). 버퍼를 교체하거나 복사하라는 명령은 일반적으로 두 쌍 모두에 동시에 적용되므로, 한쪽 눈이 다른 쪽 눈보다 오래된 이미지를 보는 일은 없다.

사중 버퍼링은 그래픽 카드 드라이버의 특별한 지원을 필요로 하며, 대부분의 소비자용 카드에서는 비활성화되어 있다. AMD의 라데온 HD 6000 시리즈 이상에서 이를 지원한다.

OpenGL 및 Direct3D와 같은 3D 표준은 사중 버퍼링을 지원한다.

## DMA를 위한 이중 버퍼링
**이중 버퍼링**이라는 용어는 성능 향상을 위해서가 아니라 장치의 특정 주소 지정 요구 사항을 충족하기 위해(특히 물리 주소 확장을 통해 더 넓은 주소 지정을 제공하는 시스템의 32비트 장치) 직접 메모리 접근(DMA) 전송을 위해 두 버퍼 간에 자료를 복사하는 데 사용된다. 윈도우 장치 드라이버는 "이중 버퍼링"이라는 용어가 사용될 가능성이 높은 곳이다. 리눅스와 BSD 소스 코드에서는 이를 "바운스 버퍼"(bounce buffers)라고 부른다.

일부 프로그래머는 제로 카피 기술을 사용하여 이러한 종류의 이중 버퍼링을 피하려고 노력한다.

## 기타 용도
이중 버퍼링은 비디오 신호의 인터레이싱 또는 디인터레이싱을 용이하게 하는 기술로도 사용된다.

## 같이 보기
* 스크린 테어링
* 스테레오스코피

## 각주

분류:영상 처리
분류:컴퓨터 그래픽스 알고리즘