DXGI_SWAP_EFFECT 열거형(dxgi.h)

IDXGISwapChain1::P resent1을 호출한 후 디스플레이 화면에서 픽셀을 처리하는 옵션입니다.

Syntax

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 사용하는 것이 좋습니다.
UWP에서 Win32와 동일한 방식으로 동작하지 않으며 해당 사용은 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_DESCDXGI_SWAP_CHAIN_DESC1 구조체에서 사용됩니다.

D3D12에서는 DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_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를 호출하여 다중 샘플링된 텍스처를 다중 샘플링되지 않은 스왑 체인에 resolve.

프레젠테이션 모델의 주요 차이점은 백 버퍼 콘텐츠가 컴퍼지션을 위해 DWM(바탕 화면 창 관리자)에 도착하는 방법입니다. DXGI_SWAP_EFFECT_DISCARDDXGI_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_SEQUENTIALDXGI_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와 같은 메서드로도 확장됩니다.

대칭 이동 모델 스왑 체인 및 프레젠테이션 최적화에 대한 자세한 내용은 대칭 이동 모델, 더티 사각형 및 스크롤된 영역으로 프레젠테이션 향상을 참조하세요.

예제

UWP에서 스왑 체인을 만들려면 DX11 템플릿의 새 instance 만들고 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

추가 정보

DXGI 열거형

최상의 성능을 위해 DXGI 대칭 이동 모델을 사용합니다.