Quick Reference
syncInterval = 1 -> vertical blank에 맞춰 표시, tearing 억제, 대기 가능
syncInterval = 0 -> VSync 대기 없음, tearing은 네 조건을 모두 만족할 때만 허용
flip model -> 현대 Windows windowed presentation의 기본 선택
buffer count -> CPU/GPU/display 겹침과 latency에 영향Present 옵션 하나가 목표 FPS를 정확히 고정하지 않습니다. Render 시간, queue depth, compositor, refresh rate와 frame limiter가 함께 작용합니다.
Swap Effect와 Buffer
가능한 환경에서는 DXGI_SWAP_EFFECT_FLIP_DISCARD 또는 FLIP_SEQUENTIAL 계열을 우선 검토합니다. Flip model은 buffer count와 format, multisampling에 제약이 있으므로 swap chain 자체에 MSAA render target을 직접 두기보다 별도 MSAA target을 resolve하는 방식이 필요할 수 있습니다.
Buffer를 늘리면 pipeline이 덜 막힐 수 있지만 입력부터 표시까지 queue latency가 늘 수 있습니다. Low-latency 요구에서는 maximum frame latency와 waitable object 같은 DXGI 기능을 함께 검토합니다.
Tearing 조건
1. IDXGIFactory5::CheckFeatureSupport로 tearing 지원 확인
2. flip-model swap chain 생성
3. DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING으로 생성
4. windowed/borderless에서 Present(0, DXGI_PRESENT_ALLOW_TEARING)Fullscreen exclusive에서는 DXGI_PRESENT_ALLOW_TEARING을 사용하지 않습니다. Variable refresh display에서도 위 지원·생성·Present 계약을 모두 지켜야 합니다.
자주 틀리는 점
- Double buffering이면 tearing이 자동으로 사라진다고 보지 않습니다.
- VSync off를 무조건 latency 최소화와 같은 말로 쓰지 않습니다. Queue와 limiter가 남을 수 있습니다.
Present(1, 0)이 항상 정확히 60 FPS를 뜻하지 않습니다.- Back buffer를 shader resource로 사용할 계획이면 생성 flag와 hazard를 확인합니다.
참고 링크
2 sources