DXGI_SWAP_EFFECT-Aufzählung (dxgi.h)
Optionen zum Behandeln von Pixeln in einer Anzeigeoberfläche nach dem Aufrufen 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
} ;
Konstanten
DXGI_SWAP_EFFECT_DISCARD Wert: 0 Verwenden Sie dieses Flag, um das Bitblockübertragungsmodell (Bitblt) anzugeben und anzugeben, dass DXGI den Inhalt des Hintergrundpuffers verwerfen soll, nachdem Sie IDXGISwapChain1::P resent1aufgerufen haben. Dieses Flag ist für eine Swapchain mit mehr als einem Hintergrundpuffer gültig, obwohl Anwendungen nur Lese- und Schreibzugriff auf Puffer 0 haben. Verwenden Sie dieses Kennzeichen, damit der Anzeigetreiber die effizienteste Darstellungsmethode für die Swapchain auswählen kann. Direct3D 12: Dieser Enumerationswert wird nie unterstützt. D3D12-Apps müssen DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL oder DXGI_SWAP_EFFECT_FLIP_DISCARDverwenden.
Hinweis Es gibt Unterschiede zwischen exklusivem Vollbild- und Vollbild-UWP. Wenn Sie eine Direct3D 11-Anwendung auf einem Windows-PC portieren, beachten Sie, dass die Verwendung von DXGI_SWAP_EFFECT_DISCARD beim Erstellen von Swapchains funktioniert. verhalten sich in UWP nicht auf die gleiche Weise wie in Win32, und die Verwendung kann sich negativ auf die GPU-Leistung auswirken. Dies liegt daran, dass UWP-Anwendungen in FLIP-Swapmodi gezwungen werden (auch wenn andere Swapmodi festgelegt sind), da dadurch die Berechnung reduziert wird. Von den Speicherkopien verwendete Zeit, die ursprünglich vom älteren Bitblt-Modell durchgeführt wurde. Der empfohlene Ansatz besteht darin, DX11 Swapchains manuell zu konvertieren, um Flip-Modelle in UWP zu verwenden, indem DXGI_SWAP_EFFECT_FLIP_DISCARD anstelle von DXGI_SWAP_EFFECT_DISCARD verwendet werden, sofern möglich. Weitere Informationen finden Sie im folgenden Beispiel diesem Artikel. |
DXGI_SWAP_EFFECT_SEQUENTIAL Wert: 1 Verwenden Sie dieses Flag, um das Bitblt-Modell anzugeben und anzugeben, dass DXGI den Inhalt des Hintergrundpuffers beibehalten, nachdem Sie IDXGISwapChain1::P resent1aufgerufen haben. Verwenden Sie diese Option, um den Inhalt der Swapchain in der Reihenfolge darzustellen, von dem ersten Puffer (Puffer 0) bis zum letzten Puffer. Dieses Flag kann nicht mit Multisampling verwendet werden. Direct3D 12: Dieser Enumerationswert wird nie unterstützt. D3D12-Apps müssen DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL oder DXGI_SWAP_EFFECT_FLIP_DISCARDverwenden.
Hinweis Verwenden Sie DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL anstelle von DXGI_SWAP_EFFECT_SEQUENTIAL, um optimale Leistung zu erzielen. Weitere Informationen finden Sie in diesem Artikel. |
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL Wert: 3 Verwenden Sie dieses Flag, um das Flip-Präsentationsmodell anzugeben und anzugeben, dass DXGI den Inhalt des Hintergrundpuffers beibehalten, nachdem Sie IDXGISwapChain1::P resent1aufgerufen haben. Dieses Flag kann nicht mit Multisampling verwendet werden. Direct3D 11: Dieser Enumerationswert wird ab Windows 8 unterstützt. |
DXGI_SWAP_EFFECT_FLIP_DISCARD Wert: 4 Verwenden Sie dieses Flag, um das Flip-Präsentationsmodell anzugeben und anzugeben, dass DXGI den Inhalt des Hintergrundpuffers verwerfen soll, nachdem Sie IDXGISwapChain1::P resent1aufgerufen haben. Dieses Flag kann nicht mit Multisampling und partieller Präsentation verwendet werden. Siehe DXGI 1.4 Verbesserungen. Direct3D 11: Dieser Enumerationswert wird ab Windows 10 unterstützt. Dieses Kennzeichen ist für eine Swapchain mit mehr als einem Hintergrundpuffer gültig. Obwohl Anwendungen lese- und schreibzugriff nur auf Puffer 0 haben.
Hinweis Windows Store-Apps müssen DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL oder DXGI_SWAP_EFFECT_FLIP_DISCARDverwenden. |
Bemerkungen
Diese Aufzählung wird von den strukturen DXGI_SWAP_CHAIN_DESC und DXGI_SWAP_CHAIN_DESC1 verwendet.
In D3D12 werden nur DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL und DXGI_SWAP_EFFECT_FLIP_DISCARD unterstützt, und die Bitbltmodelle sind nicht. Aus diesem Grund wird das Multisampling eines Hintergrundpuffers in D3D12 nicht unterstützt, und Sie müssen multisampling in der App manuell mit ID3D12GraphicsCommandList::ResolveSubresource oder ID3D12GraphicsCommandList1::ResolveSubresourceRegionausführen.
Um Multisampling mit DXGI_SWAP_EFFECT_SEQUENTIAL oder DXGI_SWAP_EFFECT_FLIP_SEQUENTIALzu verwenden, müssen Sie das Multisampling in einem separaten Renderziel ausführen. Erstellen Sie beispielsweise eine Multisampling-Textur, indem Sie ID3D11Device::CreateTexture2D- mit einer gefüllten D3D11_TEXTURE2D_DESC Struktur aufrufen (BindFlags Member auf D3D11_BIND_RENDER_TARGET und SampleDesc Member mit Multisamplingparametern festgelegt). Rufen Sie als Nächstes ID3D11Device::CreateRenderTargetView auf, um eine Renderzielansicht für die Textur zu erstellen und die Szene in der Textur zu rendern. Rufen Sie schließlich ID3D11DeviceContext::ResolveSubresource auf, um die Multisampling-Textur in Ihre Nicht-Multisampling-Swapchain aufzulösen.
Der Hauptunterschied zwischen Präsentationsmodellen besteht darin, wie Hintergrundpufferinhalte für die Komposition zum Desktop Window Manager (DWM) gelangen. Im Bitblt-Modell, das mit den DXGI_SWAP_EFFECT_DISCARD und DXGI_SWAP_EFFECT_SEQUENTIAL Werten verwendet wird, wird der Inhalt des Hintergrundpuffers in die Umleitungsoberfläche auf jedem Aufruf von IDXGISwapChain1::P resent1kopiert. Im Flip-Modell, das mit dem DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL-Wert verwendet wird, werden alle Hintergrundpuffer für das DWM freigegeben. Daher kann der DWM direkt aus diesen Hintergrundpuffern ohne zusätzliche Kopiervorgänge verfassen. Im Allgemeinen ist das Flip-Modell das effizientere Modell. Das Flip-Modell bietet auch weitere Features, z. B. erweiterte aktuelle Statistiken.
Der Unterschied zwischen DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL und DXGI_SWAP_EFFECT_FLIP_DISCARD besteht darin, dass DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL DXGI zwingt, sicherzustellen, dass der Inhalt jedes Hintergrundpuffers in IDXGISwapChain::Present
Aufrufen beibehalten wird, während DXGI_SWAP_EFFECT_FLIP_DISCARD diese Garantie nicht bereitstellt. Der Kompositor kann unter bestimmten Szenarien DirectFlip verwenden, wobei er den Hintergrundpuffer der Anwendung als gesamten Anzeigerückpuffer verwendet, wodurch die Kosten für das Kopieren des Hintergrundpuffers der Anwendung in den endgültigen Desktopbackpuffer ausgelöst werden. Mit DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL und DXGI_SWAP_EFFECT_FLIP_DISCARDkann diese Optimierung auftreten, wenn die Anwendung das einzige Element ist, das auf dem Bildschirm sichtbar ist. Selbst wenn die Anwendung nicht das einzige sichtbare Element auf dem Bildschirm ist, wenn das Flip-Modell DXGI_SWAP_EFFECT_FLIP_DISCARDist, kann der Kompositor in einigen Szenarien diese Optimierung dennoch ausführen, indem andere Inhalte auf den Hintergrundpuffer der Anwendung gezeichnet werden.
Wenn Sie IDXGISwapChain1::P resent1 in einer Flip-Modell-Swapchain (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) aufrufen, wobei 0 im parameter SyncInterval angegeben ist, IDXGISwapChain1::P resent1Verhalten entspricht dem Verhalten von Direct3D 9ExIDirect3DDevice9Ex::P resentEx mit D3DSWAPEFFECT_FLIPEX und D3DPRESENT_FORCEIMMEDIATE. Das heißt, die Laufzeit stellt nicht nur den nächsten Frame anstelle zuvor in die Warteschlange eingereihter Frames dar, sondern beendet auch alle verbleibenden Zeit, die auf den zuvor in die Warteschlange gestellten Frames verbleiben.
Unabhängig davon, ob das Flip-Modell effizienter ist, kann eine Anwendung dennoch das Bitblt-Modell auswählen, da das Bitblt-Modell die einzige Möglichkeit ist, GDI- und DirectX-Präsentationen zu kombinieren. Im Flip-Modell muss die Anwendung die Swapchain mit DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLEerstellen und dann GetDC- für den Hintergrundpuffer explizit verwenden. Nach dem ersten erfolgreichen Aufruf von IDXGISwapChain1::P resent1 in einer Flipmodell-Swapchain funktioniert GDI nicht mehr mit dem HWND-, das dieser Swapchain zugeordnet ist, auch nach der Zerstörung der Swapchain. Diese Einschränkung erstreckt sich sogar auf Methoden wie ScrollWindowEx.
Zum Anzeigen von HDR-Swapchainpufferformaten und Farbräumen ist ein Flip-Modell erforderlich. Andernfalls werden sie in SDR (sRGB) mit einem Bereich von 0 bis 1 zusammengesetzt (und abgeschnitten).
Weitere Informationen zur Flip-Modell-Swapchain und zur Optimierung der Präsentation finden Sie unter Verbessern der Präsentation mit dem Flip-Modell, schmutzigen Rechtecke und bildlaufbezogenen Bereichen.
Beispiele
Um eine Swapchain in UWP zu erstellen, müssen Sie nur eine neue Instanz der DX11-Vorlage erstellen und die Implementierung von DeviceResources::CreateWindowSizeDependentResources
in den D3D12-Beispielenbetrachten.
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
)
);
Anforderungen
Anforderung | Wert |
---|---|
Header- | dxgi.h |