DX11) SwapChain
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에서 더블 버퍼링 및 트리플 버퍼링을 통해 부드러운 화면 렌더링을 가능하게 하는 핵심적인 요소다.
이를 통해 렌더링 성능을 최적화하고 화면 찢어짐이나 깜빡임을 방지할 수 있다.
댓글남기기