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 之间存在差异。 如果要将 Direct3D 11 应用程序移植到 Windows 电脑上的 UWP,请注意,在创建交换链时使用 DXGI_SWAP_EFFECT_DISCARD 在 UWP 中的行为方式与 Win32 中的行为方式不同,并且其使用可能会损害 GPU 性能。 这是因为 UWP 应用程序被强制进入 FLIP 交换模式 (即使其他交换模式设置为) ,因为这会减少计算 内存使用的时间复制最初由较旧的 bitblt 模型完成。 建议的方法是在可能的情况下使用 DXGI_SWAP_EFFECT_FLIP_DISCARD 而不是 DXGI_SWAP_EFFECT_DISCARD 手动转换 DX11 放弃交换链以在 UWP 中使用翻转模型。 请参阅以下示例,有关详细信息,请参阅 此文 。 |
DXGI_SWAP_EFFECT_SEQUENTIAL 值:1 使用此标志可以指定 bitblt 模型,并指定在调用 IDXGISwapChain1::P resent1 后,DXGI 保留后台缓冲区的内容。 使用此选项按顺序显示交换链的内容,从第一个缓冲区 (缓冲区 0) 到最后一个缓冲区。 此标志不能用于多重采样。 Direct3D 12: 从不支持此枚举值。 D3D12 应用必须使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 或 DXGI_SWAP_EFFECT_FLIP_DISCARD。
注意 为了获得最佳性能,请使用 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 而不是 DXGI_SWAP_EFFECT_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 ,而 bitblt 模型则不受支持。 因此,D3D12 不支持对后台缓冲区进行多重采样,必须使用 ID3D12GraphicsCommandList::ResolveSubresource 或 ID3D12GraphicsCommandList1::ResolveSubresourceRegion 在应用中手动执行多重采样。
若要对 DXGI_SWAP_EFFECT_SEQUENTIAL 或 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL使用多重采样,必须在单独的呈现目标中执行多重采样。 例如,通过调用 ID3D11Device::CreateTexture2D 来创建多重采样纹理,该结构具有填充D3D11_TEXTURE2D_DESC结构, (BindFlags 成员设置为 D3D11_BIND_RENDER_TARGET,SampleDesc 成员具有多重采样参数) 。 接下来调用 ID3D11Device::CreateRenderTargetView 为纹理创建呈现目标视图,并将场景呈现为纹理。 最后调用 ID3D11DeviceContext::ResolveSubresource 将多采样纹理解析为非多重采样交换链。
表示模型之间的主要区别在于,后台缓冲区内容如何进入桌面窗口管理器 (DWM) 进行合成。 在与 DXGI_SWAP_EFFECT_DISCARD 和 DXGI_SWAP_EFFECT_SEQUENTIAL 值一起使用的 bitblt 模型中,每次调用 IDXGISwapChain1::P resent1 时,后台缓冲区的内容都会复制到重定向图面。 在与 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 值一起使用的翻转模型中,所有后台缓冲区都与 DWM 共享。 因此,DWM 可以直接从这些后台缓冲区进行组合,而无需执行任何其他复制操作。 一般情况下,翻转模型是更高效的模型。 翻转模型还提供更多功能,例如增强的当前统计信息。
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 和DXGI_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,合成器在某些情况下仍可以通过将其他内容绘制到应用程序的后台缓冲区来执行此优化。
在同步Interval 参数中指定了 0 的翻转模型交换链 (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) 上调用 IDXGISwapChain1::P resent1 时,IDXGISwapChain1::P resent1 的行为与具有 D3DSWAPEFFECT_FLIPEX 和 D3DPRESENT_FORCEIMMEDIATE 的 Direct3D 9Ex 的 IDirect3DDevice9Ex::P resentEx 的行为相同。 也就是说,运行时不仅显示下一个帧,而不是任何以前排队的帧,还会终止以前排队的帧上剩余的任何剩余时间。
无论翻转模型是否更高效,应用程序仍可能选择 bitblt 模型,因为 bitblt 模型是混合 GDI 和 DirectX 表示的唯一方法。 在翻转模型中,应用程序必须使用 DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE 创建交换链,然后必须在后台缓冲区上显式使用 GetDC 。 首次成功调用翻转模型交换链上的 IDXGISwapChain1::P resent1 后,GDI 将不再与与该交换链关联的 HWND 一起使用,即使在交换链销毁之后也是如此。 此限制甚至扩展到 ScrollWindowEx 等方法。
有关翻转模型交换链和优化演示文稿的详细信息,请参阅使用翻转模型增强演示文稿、脏矩形和滚动区域。
示例
若要在 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
)
);
要求
要求 | 值 |
---|---|
Header | dxgi.h |