다중 버퍼링

Multiple buffering
세트 1, 2, 3수직 동기화(vsync)가 활성화된 상태에서 각각 싱글, 더블, 트리플 버퍼링의 작동을 나타낸다.각 그래프에서 시간은 왼쪽에서 오른쪽으로 흐른다.3은 3개의 버퍼가 있는 스왑 체인을 보여준다; 3개의 버퍼링의 원래 정의는 프레임 D가 끝나자마자 프레임 C를 버리고 프레임 E를 버퍼 1로 지체 없이 그리기 시작한다.세트 4는 프레임(B, 이 경우)이 정상보다 오래 걸렸을 때 어떤 일이 발생하는지 보여준다.이 경우 프레임 업데이트가 누락된다.비디오 재생과 같은 시간에 민감한 구현에서는 전체 프레임이 삭제될 수 있다.3버퍼 스왑 체인을 세트 5로 설정하면 프레임 B 그리기가 시작돼 프레임 A가 비디오 메모리에 복사될 때까지 기다릴 필요 없이 프레임 B 그리기가 시작돼 지연된 프레임이 수직 재추적을 놓칠 가능성을 줄일 수 있다.

컴퓨터 과학에서 다중 버퍼링은 데이터 블록을 보유하기 위해 둘 이상의 버퍼를 사용하는 것으로, "라이터"에 의해 생성되는 데이터의 부분적인 업데이트 버전이 아니라 "리더"가 데이터의 완전한(아마도 오래된) 버전을 보게 될 것이다.독자와 작가가 서로 다른 기기일 때 이중 포트 램(DPRAM)을 사용할 필요를 피하기 위해 쓰이기도 한다.

설명

다중 버퍼링이 어떻게 작동하는지를 설명하는 쉬운 방법은 실제 사례를 들어 보는 것이다.날씨가 화창해서 노 젓는 수영장을 꺼내기로 결정했는데, 오직 당신만이 정원 호스를 찾을 수 없다.수영장에 양동이를 가득 채워야 할 것이다.그래서 당신은 수돗물에서 한 버킷(또는 완충제)을 채우고, 수도꼭지를 끄고, 수영장으로 걸어가서 물을 붓고, 수돗물로 돌아가서 연습을 반복한다.이것은 단일 버퍼링과 유사하다.수돗물을 "처리"하는 동안 수도꼭지를 꺼야 한다.

이제 두 개의 양동이만 있다면 어떻게 할 것인지 생각해 보아라.첫 번째 버킷을 채운 다음 실행 중인 탭 아래에서 두 번째 버킷을 교환하십시오.그러면 두 번째 버킷을 채우는 데 걸리는 시간이 주어지며, 첫 번째 버킷을 패들링 풀에 비우기 위해.당신이 돌아왔을 때 당신은 첫 번째 버킷이 다시 채워지도록 간단히 버킷을 교환할 수 있으며, 그 동안 당신은 두 번째 버킷을 풀에 비울 수 있다.이것은 수영장이 가득 찰 때까지 반복될 수 있다.아무것도 하지 않고 기다리는 시간이 훨씬 적은 반면 양동이가 채워져 있기 때문에 이 기술이 수영장을 훨씬 빠르게 채울 것이 분명하다.이것은 이중 버퍼링과 유사하다.수도꼭지는 항상 켜져 있을 수 있으며, 처리가 완료되는 동안 기다릴 필요가 없다.

만약 여러분이 다른 사람을 고용해서 한 사람이 채워지고 다른 사람이 비워지는 동안 수영장으로 양동이를 가지고 간다면, 이것은 3중 버퍼링과 유사할 것이다.이 단계가 충분히 오래 걸리면 더 많은 버킷을 사용할 수 있으므로 탭이 계속해서 버킷 채우기 작업을 실행할 수 있다.

컴퓨터 과학에서, 전원이 꺼질 수 없거나 꺼서는 안 되는 실행 탭이 있는 상황은 흔하다(예: 오디오 스트림).또한 컴퓨터는 일반적으로 스트림보다는 데이터 덩어리를 처리하는 것을 선호한다.이런 상황에서는 이중 버퍼링이 채용되는 경우가 많다.

이중 버퍼링 페트리 네트

이중 버퍼링 페트리 네트

그림의 페트리 네트는 이중 버퍼링이 어떻게 작동하는지를 보여준다.전환 W1과 W2는 각각 버퍼 1과 2에 대한 쓰기를 나타내고, R1과 R2는 버퍼 1과 2의 읽기를 각각 나타낸다.처음에는 전환 W1만 활성화된다.W1 화재 후 R1과 W2는 모두 활성화되며 병렬로 진행할 수 있다.완료되면 R2와 W1이 병렬로 진행된다.

따라서 W1이 단독으로 발사되는 초기 과도현상이 발생한 후 이 시스템은 주기적이며 전환이 활성화된다. 항상 쌍으로 (R1은 W2를, R2는 W1을 각각)

컴퓨터 그래픽의 이중 버퍼링

컴퓨터 그래픽에서 이중 버퍼링은 말더듬이나 찢어짐, 기타 아티팩트가 없는 그래픽을 그리는 기법이다.

프로그램이 디스플레이를 그리기 어려워 픽셀이 두 번 이상 바뀌지 않는다.예를 들어, 텍스트의 페이지를 업데이트할 때, 새로운 글자가 아닌 오래된 글자에 사용된 픽셀만 지우는 것보다 전체 페이지를 지운 다음 글자를 그리는 것이 훨씬 쉽다.그러나 이 중간 이미지는 사용자가 깜박이는 것으로 본다.또한 컴퓨터 모니터는 눈에 보이는 비디오 페이지를 끊임없이 다시 그리기 때문에(전통적으로 초당 60회 정도), 완벽한 업데이트조차도 "새" 이미지와 "" 이미지, "이전" 이미지 사이의 수평 분할자로서 순간적으로 볼 수 있는데, 이는 찢기는 것으로 알려져 있다.

소프트웨어 이중 버퍼링

이중 버퍼링을 소프트웨어로 구현하면 모든 도면 작업이 시스템 RAM의 일부 영역에 결과를 저장하게 된다. 이러한 영역은 종종 "백 버퍼"라고 불린다.모든 도면 작업이 완료된 것으로 간주되는 경우 전체 영역(또는 변경된 부분만)을 비디오 RAM("프론트 버퍼")에 복사한다. 이 복사는 일반적으로 찢어짐을 방지하기 위해 모니터의 래스터 빔과 동기화된다.이중 버퍼링을 소프트웨어로 구현하려면 백 버퍼에 할당된 시스템 메모리, 복사 작업 시간, 동기화를 기다리는 시간 등으로 인해 단일 버퍼링보다 더 많은 메모리와 CPU 시간이 필요하다.

소프트웨어 이중 버퍼링의 첫 번째 구현은 1986년 7월 컬러 컴퓨터 매거진에서 Archor Wright에 의해 만들어졌다.54 & 55페이지 "암노트론 애니메이션"

컴포지팅 윈도우 매니저는 종종 "복사" 작업과 창문을 배치하고, 스케일이나 뒤틀림 효과로 변형하고, 일부를 투명하게 만드는 데 사용되는 "복사" 작업을 결합한다.따라서 "전면 버퍼"는 화면에 보이는 합성 이미지만 포함할 수 있으며, 전체 창 내용의 합성 이미지가 포함된 창마다 다른 "백 버퍼"가 있을 수 있다.

페이지 플립

페이지 플립 방식에서는 데이터를 복사하는 대신 두 버퍼를 모두 표시할 수 있다(둘 다 비디오 RAM에 있음).어느 때든 모니터에 의해 하나의 버퍼가 능동적으로 표시되고 있는 반면 다른 하나는 배경 버퍼가 그려지고 있는 것이다.백그라운드 버퍼가 완료되면 두 사람의 역할이 전환된다.페이지 플립은 일반적으로 비디오 디스플레이 컨트롤러하드웨어 레지스터(비디오 메모리의 디스플레이 데이터 시작에 대한 포인터 값)를 수정하여 이루어진다.

페이지 플립은 데이터를 복사하는 것보다 훨씬 빠르며 모니터의 수직 블랭킹 간격(비디오 데이터가 그려지지 않는 공백 기간) 동안 페이지가 전환되는 한 찢어짐 현상이 나타나지 않도록 보장할 수 있다.현재 활성화되어 보이는 버퍼를 전면 버퍼라고 하고, 백그라운드 페이지는 백 버퍼라고 한다.

트리플 버퍼링

컴퓨터 그래픽에서 트리플 버퍼링은 더블 버퍼링과 유사하지만 향상된 성능을 제공할 수 있다.이중 버퍼링에서 프로그램은 완성된 도면이 복사되거나 교체될 때까지 기다렸다가 다음 도면을 시작해야 한다.이 대기 기간은 어느 버퍼도 만질 수 없는 수 밀리초가 될 수 있다.

트리플 버퍼링에서 프로그램은 두 개의 등 버퍼를 가지고 있으며 이러한 복사와는 관련이 없는 버퍼를 즉시 그리기 시작할 수 있다.세 번째 버퍼인 전면 버퍼는 그래픽 카드에 의해 판독되어 모니터에 영상을 표시한다.일단 이미지가 모니터로 전송되면, 전면 버퍼는 가장 최근의 전체 이미지를 보유하는 백 버퍼로 플립(또는 복사)된다.뒷면 버퍼 중 하나가 항상 완성되기 때문에 그래픽 카드는 소프트웨어가 완료될 때까지 기다릴 필요가 없다.결과적으로, 소프트웨어와 그래픽 카드는 완전히 독립적이어서 그들만의 속도로 달릴 수 있다.마지막으로 표시된 영상은 동기화를 기다리지 않고 시작되어 지연이 최소화되었다.[1]

모니터 새로 고침 이벤트를 위해 그래픽 하드웨어를 폴링하지 않는 소프트웨어 알고리즘 때문에 알고리즘은 하드웨어가 렌더링할 수 있는 한 계속해서 추가 프레임을 그릴 수 있다.리프레시 간격보다 훨씬 빠르게 완료되는 프레임의 경우 복사하기 전에 백업 버퍼의 프레임을 여러 번 새로운 반복으로 교체할 수 있다.즉, 프레임은 연속적인 프레임에 의해 덮어쓰기 전에는 전혀 사용되지 않는 백 버퍼에 쓰여질 수 있다.엔비디아는 이 방법을 "Fast Sync"[2]라는 이름으로 구현했다.

트리플 버퍼링이라고도 하는 다른 방법은 3개의 버퍼가 있는 스왑 체인이다.프로그램이 두 개의 등 버퍼를 모두 그린 후에는 첫 번째 버퍼가 화면에 배치될 때까지 기다린 후 다른 등 버퍼를 그린다(즉, 3-길이 첫 번째 인, 첫 번째 아웃 대기열).대부분의 윈도 게임은 트리플 버퍼링을 활성화할 때 이 방법을 참고하는 것 같다.[citation needed]

쿼드 버퍼링

쿼드 버퍼링이란 입체 구현 시 왼쪽 및 오른쪽 눈 이미지 각각에 이중 버퍼링을 사용하여 총 4개의 버퍼링(트리플 버퍼링을 사용할 경우 6개의 버퍼가 있음)을 말한다.버퍼를 교환하거나 복사하는 명령은 일반적으로 한 번에 두 쌍에 모두 적용되므로, 한 쪽 눈이 다른 쪽 눈보다 오래된 이미지를 볼 수 없다.

쿼드 버퍼링은 대부분의 소비자 카드에 사용할 수 없는 그래픽 카드 드라이버에서 특별한 지원이 필요하다.AMD의 Radeon HD 6000 시리즈 이상에서는 [1]을(를) 지원한다.

OpenGL[3]Direct3D와 같은 3D 표준은 쿼드 버퍼링을 지원한다.

DMA용 이중 버퍼링

이중 버퍼링이란 용어는 DMA(Direct Memory Access) 전송을 위해 두 버퍼 사이의 데이터를 복사하는 데 사용되며, 성능 향상을 위한 이 아니라 장치의 특정 주소 지정 요구 사항(예: 물리적 주소 확장을 통해 더 넓은 주소 지정을 제공하는 시스템의 32비트 장치)을 충족하기 위해 사용된다.[4]DOS와 Windows 장치 드라이버는 "더블 버퍼링"이라는 용어가 사용되기 쉬운 곳이다.Linux와 BSD 소스 코드는 이를 "바운스 버퍼"[5]라고 부른다.

일부 프로그래머들은 제로 카피 기법으로 이런 종류의 이중 버퍼링을 피하려고 한다.

기타 용도

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

참고 항목

참조

  1. ^ "Triple Buffering: Why We Love It". AnandTech. June 26, 2009. Retrieved 2009-07-16.
  2. ^ Smith, Ryan. "The NVIDIA GeForce GTX 1080 & GTX 1070 Founders Editions Review: Kicking Off the FinFET Generation". Retrieved 2017-08-01.
  3. ^ OpenGL 3.0 사양, 4장
  4. ^ "Physical Address Extension - PAE Memory and Windows". Microsoft Windows Hardware Development Central. 2005. Retrieved 2008-04-07.
  5. ^ Gorman, Mel. "Understanding The Linux Virtual Memory Manager, 10.4 Bounce Buffers".

http://drive.google.com/file/d/1Uz5vEiTvnhgNxAYow-dxQnwKhb0mpCR2/view 컬러 컴퓨터 매거진 54 & 55페이지의 암노트론 애니메이션.

외부 링크