기록공간

[DirectX 12] 기본지식 - Swap Chain(교환 사슬)과 더블 버퍼링 본문

DirectX/기초

[DirectX 12] 기본지식 - Swap Chain(교환 사슬)과 더블 버퍼링

입코딩 2020. 2. 3. 11:19
반응형

예를 들어 모니터에 하나의 프레임 버퍼를 가지고 게임 세상을 표현한다고 생각해보자. 매 프레임마다 버퍼를 지우고 그리거나 이미 그려진 버퍼에 덮어 쓰게 될것이다. 전자 같은 경우에는 지우고 다시 그리다보니 찰나의 시간에 지워진 버퍼가 보여지게 되고 이것이 화면 깜빡임(Screen Flickering)현상으로 보여지게 될것이다. 그리고 후자 같은 경우에는 덮어 쓰는 도중에 현재 그리는 프레임 데이터와 이전 프레임 데이터가 같이 보이는 순간이 생겨 화면 찢어짐(Screen Tearing) 현상이 생길 것이다. 결국 그려지는 과정이 보이다보니 보는 사람 입장에서는 불편할 수 밖에 없을것이다.

화면 찢어짐 효과

이러한 현상들을 피하고자 사용하는 방법이 바로 2개의 프레임 버퍼를 이용하는 것이다. 2개의 프레임 버퍼는 각각 화면 바깥의 텍스처인 후면 버퍼(Back Buffer)와 화면에 직접 표시되는 전면 버퍼(Front Buffer)를 뜻한다. 완전한 한 프레임을 후면 버퍼에 그리고 이전 프레임을 표현했던 전면 버퍼와 후면 버퍼의 역할을 맞바꾸게 된다. 이렇게 하면 화면을 보는 사용자에게는 프레임이 그려지는 과정이 나타나지 않는다. 사용자는 그저 완성된 프레임만을 볼 뿐이다. 이러한 기법을 더블 버퍼링(Double Buffering)이라고 부른다.

 

 

Direct3D에서는 2개의 버퍼간의 역할을 교환하여 페이지가 전환되게 하는 것을 프레젠팅(presenting, 제시)라고 부른다. 이는 매우 효율적이다. 왜냐하면 후면 버퍼의 모든 내용을 직접 복사(Blit)하여 전면 버퍼로 넘겨주는 것이 아니라 현재 후면 버퍼의 포인터와 전면 버퍼의 포인터를 서로 맞바꾸는 플리핑(Flipping)을 사용하기 때문이다.

 

플리핑은 보통 하드웨어적인 방법으로 이루어지기 때문에 정말 빠르다.

플리핑을 위해서 Direct3D에서는 전면 버퍼와 후면 버퍼 사이의 스왑 체인(Swap Chain)을 형성하고 있다. 스왑 체인은 순차적으로 연결된 프레임 버퍼들의 집합이라고 표현할 수 있다. 

 

Direct3D에서 스왑 체인을 대표하는 인터페이스는 IDXGISwapChain이다. 이 인터페이스는 전면 버퍼 텍스처와 와 후면 버퍼 텍스처를 담으며, 버퍼 크기 변경(ResizeBuffers()) 혹은 프레젠팅(Present()) 등을 위한 메서드들도 제공해준다. 

 

반응형
Comments