DXGI_SWAP_EFFECT 열거형(dxgi.h)
IDXGISwapChain1::P resent1호출한 후 디스플레이 화면에서 픽셀을 처리하는 옵션입니다.
통사론
typedef enum DXGI_SWAP_EFFECT {
DXGI_SWAP_EFFECT_DISCARD = 0,
DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3,
DXGI_SWAP_EFFECT_FLIP_DISCARD = 4
} ;
상수
DXGI_SWAP_EFFECT_DISCARD 값: 0 이 플래그를 사용하여 비트 블록 전송(bitblt) 모델을 지정하고 IDXGISwapChain1::P resent1호출한 후 DXGI가 백 버퍼의 내용을 삭제하도록 지정합니다. 이 플래그는 둘 이상의 백 버퍼가 있는 스왑 체인에 유효하지만 애플리케이션은 버퍼 0에 대한 읽기 및 쓰기 액세스 권한만 있습니다. 디스플레이 드라이버가 스왑 체인에 가장 효율적인 프레젠테이션 기술을 선택할 수 있도록 하려면 이 플래그를 사용합니다. Direct3D 12: 이 열거형 값은 지원되지 않습니다. D3D12 앱은 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 또는 DXGI_SWAP_EFFECT_FLIP_DISCARD사용해야 합니다.
참고 전체 화면 전용 및 전체 화면 UWP 간에 차이가 있습니다. Windows PC에서 Direct3D 11 애플리케이션을 UWP로 포팅하는 경우 스왑 체인을 만들 때 DXGI_SWAP_EFFECT_DISCARD 사용합니다. Win32에서와 같은 방식으로 UWP에서 동작하지 않으며 해당 사용은 GPU 성능에 해로울 수 있습니다. 이는 UWP 애플리케이션이 FLIP 스왑 모드(다른 스왑 모드가 설정된 경우에도)로 강제 적용되기 때문입니다. 이는 계산을 감소시키기 때문입니다. 원래 이전 비트블렛 모델에서 수행한 메모리 복사본에서 사용한 시간입니다. 권장되는 방법은 가능한 경우 DXGI_SWAP_EFFECT_DISCARD 대신 DXGI_SWAP_EFFECT_FLIP_DISCARD 사용하여 UWP 내에서 대칭 이동 모델을 사용하도록 DX11 취소 스왑 체인을 수동으로 변환하는 것입니다. 자세한 내용은 아래 예제를 참조하고 이 문서 참조하세요. |
DXGI_SWAP_EFFECT_SEQUENTIAL 값: 1 이 플래그를 사용하여 비트블렛 모델을 지정하고 IDXGISwapChain1::P resent1호출한 후 DXGI가 백 버퍼의 콘텐츠를 유지하도록 지정합니다. 첫 번째 버퍼(버퍼 0)에서 마지막 버퍼까지 스왑 체인의 내용을 순서대로 표시하려면 이 옵션을 사용합니다. 이 플래그는 다중 샘플링과 함께 사용할 수 없습니다. Direct3D 12: 이 열거형 값은 지원되지 않습니다. D3D12 앱은 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 또는 DXGI_SWAP_EFFECT_FLIP_DISCARD사용해야 합니다.
참고 최상의 성능을 위해 DXGI_SWAP_EFFECT_SEQUENTIAL대신 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 사용합니다. 자세한 내용은 이 문서 참조하세요. |
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 값: 3 이 플래그를 사용하여 대칭 이동 프레젠테이션 모델을 지정하고 IDXGISwapChain1::P resent1호출한 후 DXGI가 백 버퍼의 콘텐츠를 유지하도록 지정합니다. 이 플래그는 다중 샘플링과 함께 사용할 수 없습니다. Direct3D 11: 이 열거형 값은 Windows 8부터 지원됩니다. |
DXGI_SWAP_EFFECT_FLIP_DISCARD 값: 4 이 플래그를 사용하여 대칭 이동 프레젠테이션 모델을 지정하고 IDXGISwapChain1::P resent1호출한 후 DXGI가 백 버퍼의 내용을 삭제하도록 지정합니다. 이 플래그는 다중 샘플링 및 부분 프레젠테이션과 함께 사용할 수 없습니다. DXGI 1.4 개선 사항참조하세요. Direct3D 11: 이 열거형 값은 Windows 10부터 지원됩니다. 이 플래그는 둘 이상의 백 버퍼가 있는 스왑 체인에 유효합니다. 애플리케이션은 버퍼 0에 대해서만 읽기 및 쓰기 액세스 권한이 있지만
참고 Windows 스토어 앱은 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 또는 DXGI_SWAP_EFFECT_FLIP_DISCARD사용해야 합니다. |
발언
이 열거형은 DXGI_SWAP_CHAIN_DESC 및 DXGI_SWAP_CHAIN_DESC1 구조체에서 사용됩니다.
D3D12에서는 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 및 DXGI_SWAP_EFFECT_FLIP_DISCARD만 지원되며 비트블렛 모델은 지원되지 않습니다. 이 때문에 D3D12에서는 백 버퍼 다중 샘플링이 지원되지 않으며 ID3D12GraphicsCommandList::ResolveSubresource 또는 ID3D12GraphicsCommandList1::ResolveSubresourceRegion사용하여 앱에서 수동으로 다중 샘플링을 수행해야 합니다.
DXGI_SWAP_EFFECT_SEQUENTIAL 또는 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL다중 샘플링을 사용하려면 별도의 렌더링 대상에서 다중 샘플링을 수행해야 합니다. 예를 들어 채워진 D3D11_TEXTURE2D_DESC 구조로 ID3D11Device::CreateTexture2D 호출하여 다중 샘플링된 텍스처를 만듭니다(BindFlags 멤버는 D3D11_BIND_RENDER_TARGET 설정하고 다중 샘플링 매개 변수를 사용하여 SampleDesc 멤버를). 다음으로 id3D11Device::CreateRenderTargetView 호출하여 텍스처에 대한 렌더링 대상 보기를 만들고 장면을 텍스처로 렌더링합니다. 마지막으로 ID3D11DeviceContext::ResolveSubresource 호출하여 다중 샘플링된 텍스처를 다중 샘플링되지 않은 스왑 체인으로 확인합니다.
프레젠테이션 모델 간의 주요 차이점은 백 버퍼 콘텐츠가 컴퍼지션을 위해 DWM(데스크톱 창 관리자)에 도착하는 방법입니다. DXGI_SWAP_EFFECT_DISCARD 및 DXGI_SWAP_EFFECT_SEQUENTIAL 값과 함께 사용되는 비트블렛 모델에서 idXGISwapChain1::P resent1 호출할 때마다 백 버퍼의 내용이 리디렉션 화면에 복사됩니다. DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 값과 함께 사용되는 대칭 이동 모델에서 모든 백 버퍼는 DWM과 공유됩니다. 따라서 DWM은 추가 복사 작업 없이 해당 백 버퍼에서 바로 구성할 수 있습니다. 일반적으로 대칭 이동 모델은 더 효율적인 모델입니다. 또한 대칭 이동 모델은 향상된 현재 통계와 같은 더 많은 기능을 제공합니다.
DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARD 차이점은 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL DXGI가 각 백 버퍼의 내용이 IDXGISwapChain::Present
호출에서 유지되도록 보장하는 반면 DXGI_SWAP_EFFECT_FLIP_DISCARD 이 보장을 제공하지 않는다는 것입니다. 특정 시나리오에서 작성자는 DirectFlip을 사용할 수 있습니다. 여기서 애플리케이션의 백 버퍼를 전체 디스플레이 백 버퍼로 사용하여 애플리케이션의 백 버퍼를 최종 데스크톱 백 버퍼로 복사하는 비용을 절감합니다.
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 및 DXGI_SWAP_EFFECT_FLIP_DISCARD애플리케이션이 화면에 표시되는 유일한 항목일 때 이 최적화가 발생할 수 있습니다. 그러나 애플리케이션이 화면에 표시되는 유일한 항목이 아닌 경우에도 대칭 이동 모델이 DXGI_SWAP_EFFECT_FLIP_DISCARD경우 일부 시나리오에서는 다른 콘텐츠를 애플리케이션의 백 버퍼에 그려서 이 최적화를 수행할 수 있습니다.
SyncInterval 매개 변수에 0이 지정된 대칭 이동 모델 스왑 체인(DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL)에서 IDXGISwapChain1::P resent1 호출하는 경우 IDXGISwapChain1::P resent1동작은 Direct3D 9ExIDirect3DDevice9Ex::P resentExD3DSWAPEFFECT_FLIPEX 및 D3DPRESENT_FORCEIMMEDIATE동작과 동일합니다. 즉, 런타임은 이전에 큐에 대기한 프레임 대신 다음 프레임을 표시할 뿐만 아니라 이전에 큐에 대기된 프레임에 남아 있는 남은 시간도 종료합니다.
비트블릿 모델이 GDI와 DirectX 프레젠테이션을 혼합하는 유일한 방법이기 때문에 대칭 이동 모델이 더 효율적인지 여부에 관계없이 애플리케이션은 여전히 비트블릿 모델을 선택할 수 있습니다. 대칭 이동 모델에서 애플리케이션은 DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE사용하여 스왑 체인을 만든 다음 백 버퍼에서 GetDC 명시적으로 사용해야 합니다. 플립 모델 스왑 체인에서 IDXGISwapChain1::P resent1 첫 번째 성공적으로 호출된 후 GDI는 스왑 체인이 소멸된 후에도 해당 스왑 체인과 연결된 HWND 더 이상 작동하지 않습니다. 이 제한은 ScrollWindowEx같은 메서드로도 확장됩니다.
HDR 스왑 체인 버퍼 형식 및 색 공간을 표시하려면 대칭 이동 모델이 필요합니다. 그렇지 않으면 SDR(0-1 범위의 sRGB)에서 구성되고 잘립니다.
대칭 이동 모델 스왑 체인 및 프레젠테이션 최적화에 대한 자세한 내용은 대칭 이동 모델, 더티 사각형 및 스크롤된 영역 프레젠테이션 향상을 참조하세요.
예제
UWP에서 스왑 체인을 만들려면 DX11 템플릿의 새 인스턴스를 만들고 D3D12 샘플에서 DeviceResources::CreateWindowSizeDependentResources
구현을 살펴보기만 하면 됩니다.
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
swapChainDesc.Width = lround(m_d3dRenderTargetSize.Width); // Match the size of the window.
swapChainDesc.Height = lround(m_d3dRenderTargetSize.Height);
swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain format.
swapChainDesc.Stereo = false;
swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling.
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 2; // Use double-buffering to minimize latency.
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; // All Windows Store apps must use a flip effect.
swapChainDesc.Flags = 2048;
swapChainDesc.Scaling = scaling;
swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
// This sequence obtains the DXGI factory that was used to create the Direct3D device above.
ComPtr<IDXGIDevice3> dxgiDevice;
DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice));
ComPtr<IDXGIAdapter> dxgiAdapter;
DX::ThrowIfFailed(dxgiDevice->GetAdapter(&dxgiAdapter));
ComPtr<IDXGIFactory4> dxgiFactory;
DX::ThrowIfFailed(dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)));
ComPtr<IDXGISwapChain1> swapChain;
DX::ThrowIfFailed(
dxgiFactory->CreateSwapChainForCoreWindow(
m_d3dDevice.Get(),
reinterpret_cast<IUnknown*>(m_window.Get()),
&swapChainDesc,
nullptr,
&swapChain
)
);
요구 사항
요구 | 값 |
---|---|
헤더 | dxgi.h |