본문 바로가기
dev log/directX 11

[DirectX] 더블 버퍼링(Double Buffering)과 스왑 체인(Swap Chain)

by 망고먹는 개발자 2021. 7. 26.

컴퓨터 디스플레이에서 이미지를 출력할 때에는 일반적으로 이전 프레임을 모두 지우고(clear) 새로이 다시 그리게 된다. 이전 프레임과 현재 프레임의 차이를 계산해서 해당 부분만 갱신하는 것이 비효율적이기 때문이다.

 

GPU는 비디오 메모리에 존재하는 프레임 버퍼에 위와 같이 계속해서 이미지를 지우고 그리는 과정을 반복한다.

 

그리고 비디오 컨트롤러는 이 프레임 버퍼를 참조해서 스크린에 이미지를 출력하게 되는데, 이 속도가 GPU가 프레임 버퍼에 이미지를 그리는 속도보다 훨씬 빠르다.

때문에 프레임 버퍼가 갱신되는 과정이 스크린에 모두 그려지게 되면서 이미지 전체가 사라졌다 다시 그려지는 것처럼 깜빡거림(Flickering)이 생길 수 있다.

 

이 현상을 방지하기 위해서 전면 버퍼(front buffer)외에 화면 밖(off screen)의 후면 버퍼(back buffer)를 추가적으로 두는데, 이 방식을 다중 버퍼링(Multiple Buffering)이라고 하고, 그 중 2개의 버퍼를 사용하는 방식을 이중 버퍼링(Double Buffering)이라고 한다. (보통은 2개의 버퍼만으로 대부분의 문제가 해결된다)

 

1. GPU는 후면 버퍼에 이미지를 그린다. 

2. 후면 버퍼에 그리기가 완료되면 전면 버퍼와 후면 버퍼를 교환해

3. 비디오 컨트롤러가 해당 전면 버퍼를 참조해 스크린을 갱신한다.

 

전면 버퍼와 후면 버퍼의 포인터만 교환하도록 해서 굉장히 효율적으로 구현될 수 있다.

 

포인터가 연속적으로 교체되는 모양이 사슬과 같다고 해서 DirectX에서는 이것을 교환 사슬(Swap Chain)이라고 하며 위와 같이 전면 버퍼와 후면 버퍼의 포인터를 교환하는 작업을 Present라고 부른다.

DirectX의 IDXGISwapChain이라는 인터페이스에서 Present를 포함한 스왑 체인의 명세를 확인할 수 있다.

 
반응형

'dev log > directX 11' 카테고리의 다른 글

[번역] Tutorial 3: Initializing DirectX 11  (0) 2021.08.12
DirectX 11 개발 환경 설정  (0) 2021.08.10
[번역] Tutorial 2: Creating a Framework and Window  (0) 2021.08.10
DirectX 11 시작  (2) 2021.08.09

댓글