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_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를 호출하여 다중 샘플링된 텍스처를 다중 샘플링되지 않은 스왑 체인에 resolve.
프레젠테이션 모델의 주요 차이점은 백 버퍼 콘텐츠가 컴퍼지션을 위해 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 9Ex의 IDirect3DDevice9Ex::P resentEx와 D3DSWAPEFFECT_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 |