SwapChain

SwapChain은 DirectX11을 사용한 그래픽 렌더링에서 필수적인 개념 중 하나이다.

기본적으로 더블 버퍼링(Double Buffering) 또는 트리플 버퍼링(Triple Buffering)등 여러기법을 통해 화면을 부드럽게 렌더링하는 역할을 한다.

DXGI_SWAP_CHAIN_DESC Desc = {};

// SwapChain이 화면을 게시(Present) 할때 출력 목적지 윈도우
// SwapChain 생성 정보 초기화
Desc.OutputWindow = MainWnd; // 출력 대상 윈도우
Desc.Windowed = true;		 // 창 모드 사용

// SwapChain이 만들어질 때 버퍼 옵션
// 백버퍼 설정
Desc.BufferCount = 1; // 백버퍼 수
Desc.BufferDesc.Width = (UINT)RenderResolution.x;		// 버퍼 너비
Desc.BufferDesc.Height = (UINT)RenderResolution.y;		// 버퍼 높이
Desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;	// 색상 포맷
Desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;		// 렌더 타겟 용도
// 디스플레이 모드 설정
Desc.BufferDesc.RefreshRate.Denominator = 1;	// Refresh 분모
Desc.BufferDesc.RefreshRate.Numerator = 60;		// Refresh 분자
Desc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;	// 스케일링 없음
Desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;	// 스캔 라인 순서 없음

// 멀티 샘플링 설정
Desc.SampleDesc.Count = 1;		// 샘플 갯수
Desc.SampleDesc.Quality = 0;	// 샘플 품질

// SwapChain 이펙트 설정.
// 1. 비트 블록 전송 모델
// DXGI_SWAP_EFFECT_DISCARD
// DXGI_SWAP_EFFECT_SEQUENTIAL
// 2. 대칭 이동 프레젠테이션 모델
// DXGI_SWAP_EFFECT_FLIP_DISCARD
// DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
Desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;

// DXGI 인터페이스 획득
ComPtr<IDXGIDevice> DXGIDevice = nullptr;
ComPtr<IDXGIAdapter> Adatper = nullptr;
ComPtr<IDXGIFactory> Factory = nullptr;

// Device에서 DXGIDevice 인터페이스 획득
Device->QueryInterface(__uuidof(IDXGIDevice), (void**)DXGIDevice.GetAddressOf());
// DXGIDevice에서 상위 Adapter 인터페이스 획득
DXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void**)Adatper.GetAddressOf());
// Adepter에서 상위 Factory 인터페이스 획득
Adatper->GetParent(__uuidof(IDXGIFactory), (void**)Factory.GetAddressOf());

// SwapChain 생성 시도
if (FAILED(Factory->CreateSwapChain(Device.Get(), &Desc, SwapChain.GetAddressOf())))
{
	// 실패 시 반환
	return	E_FAIL;
}

Swap Chain의 역할

프레임 버퍼 관리

  • DirectX에서는 GPU가 화면에 출력할 이미지를 백 버퍼(Back Buffer) 에 렌더링한 후, 이를 프론트 버퍼(Front Buffer) 로 교체하여 화면에 표시한다.
  • 이 과정을 “스왑(Swap)” 이라고 하며, SwapChain이 이를 관리한다.

화면 깜빡임(Tearing) 방지

  • 만약 백 버퍼 없이 GPU가 직접 프론트 버퍼에 그린다면, 한 프레임을 그리는 도중에 다른 프레임을 덮어쓰게 되어 화면이 깜빡이거나 찢어지는(Tearing) 문제가 발생한다.

더블 버퍼링 & 트리플 버퍼링 지원

  • 더블 버퍼링 (Double Buffering)

    • 백 버퍼(Back Buffer)와 프론트 버퍼(Front Buffer) 두 개의 버퍼를 사용하여 하나는 렌더링하고, 다른 하나는 화면에 표시하는 방식.
  • 트리플 버퍼링 (Triple Buffering)

    • 세 개의 버퍼를 사용하여 더 부드러운 프레임 전환을 지원하며, V-Sync가 걸려도 성능 저하를 줄일 수 있음.

SwapChain을 사용하는 이유

렌더링과 디스플레이를 분리

  • GPU는 백 버퍼에서 렌더링을 수행하고, 작업이 완료되면 백 버퍼와 프론트 버퍼를 교체(Swap)하여 디스플레이에 표시한다.
  • 이렇게 하면 현재 프레임을 표시하는 동안 다음 프레임을 렌더링할 수 있어 성능이 향상된다. (향상되 보이는 것 같다.)

부드러운 화면 전환

  • 만약 SwapChain이 없다면 GPU가 프레임을 렌더링하는 도중 바로 화면에 반영될 가능성이 높다.
  • SwapChain을 사용하면 GPU가 한 프레임을 완전히 렌더링한 후, V-Sync(수직동기화)와 동기화하여 한 번에 교체하기 때문에 화면이 부드럽게 표시된다.

성능 최적화

  • 게임이나 그래픽 응용 프로그램에서 최적의 프레임 속도를 유지하려면 백 버퍼를 활용하여 렌더링 성능을 극대화해야 한다.
  • SwapChain을 사용하면 프레임이 GPU에서 빠르게 생성되고, 디스플레이 장치에서 효율적으로 출력될 수 있다.

SwapChain 핵심 개념

개념 설명
백 버퍼(Back Buffer) GPU가 새로운 프레임을 렌더링하는 공간
프론트 버퍼(Front Buffer) 현재 화면에 출력되는 버퍼
Swap Chain 백 버퍼와 프론트 버퍼를 교환하는 역할
더블 버퍼링 두 개의 버퍼를 사용하여 화면을 부드럽게 전환
트리플 버퍼링 세 개의 버퍼를 사용하여 성능 향상 및 V-Sync 최적화
V-Sync(수직동기화) 프레임 교환을 모니터 주사율과 동기화하여 Tearing 방지

결론

Swap Chain은 DirectX 11에서 더블 버퍼링 및 트리플 버퍼링을 통해 부드러운 화면 렌더링을 가능하게 하는 핵심적인 요소다.

이를 통해 렌더링 성능을 최적화하고 화면 찢어짐이나 깜빡임을 방지할 수 있다.

태그: ,

카테고리:

업데이트:

댓글남기기