DXGI_SWAP_EFFECT-Enumeration (dxgi.h)
Optionen für die Behandlung von Pixeln in einer Anzeigeoberfläche nach dem Aufruf von 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 Rückpuffers verwirft, nachdem Sie IDXGISwapChain1::P resent1 aufgerufen haben. Dieses Flag gilt für eine Swap chain mit mehr als einem Backpuffer, obwohl Anwendungen nur Lese- und Schreibzugriff auf Puffer 0 haben. Verwenden Sie dieses Flag, um dem Anzeigetreiber die Auswahl der effizientesten Darstellungstechnik für die Swapchain zu ermöglichen. Direct3D 12: Dieser Enumerationswert wird nie unterstützt. D3D12-Apps müssen DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL oder DXGI_SWAP_EFFECT_FLIP_DISCARD verwenden.
Hinweis Es gibt Unterschiede zwischen vollbild-exklusiver und Vollbild-UWP. Wenn Sie eine Direct3D 11-Anwendung zu UWP auf einem Windows-PC portieren, beachten Sie, dass die Verwendung von DXGI_SWAP_EFFECT_DISCARD beim Erstellen von Swapchains dies tut. Verhalten sich in UWP nicht auf die gleiche Weise wie in Win32, und seine Verwendung kann sich negativ auf die GPU-Leistung auswirken. Dies liegt daran, dass UWP-Anwendungen in FLIP-Auslagerungsmodi gezwungen werden (auch wenn andere Auslagerungsmodi festgelegt sind), da dies die Berechnung reduziert. Zeit, die von den Speicherkopien verwendet wird, die ursprünglich vom älteren Bitblt-Modell ausgeführt wurden. Der empfohlene Ansatz besteht darin, DX11-Verwerfen-Swapchains manuell zu konvertieren, um Flip-Modelle innerhalb von UWP zu verwenden, wobei DXGI_SWAP_EFFECT_FLIP_DISCARD anstelle von DXGI_SWAP_EFFECT_DISCARD nach Möglichkeit verwendet wird. Weitere Informationen finden Sie im folgenden Beispiel. Weitere Informationen finden Sie in diesem Artikel . |
DXGI_SWAP_EFFECT_SEQUENTIAL Wert: 1 Verwenden Sie dieses Flag, um das Bitblt-Modell anzugeben und anzugeben, dass DXGI den Inhalt des Backpuffers beibehalten, nachdem Sie IDXGISwapChain1::P resent1 aufgerufen haben. Verwenden Sie diese Option, um den Inhalt der Swap chain in der Reihenfolge vom ersten Puffer (Puffer 0) bis zum letzten Puffer darzustellen. 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_DISCARD verwenden.
Hinweis Verwenden Sie DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL anstelle von DXGI_SWAP_EFFECT_SEQUENTIAL , um eine 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 Rückpuffers beibehalten, nachdem Sie IDXGISwapChain1::P resent1 aufgerufen 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 Rückpuffers verwirft, nachdem Sie IDXGISwapChain1::P resent1 aufgerufen haben. Dieses Flag kann nicht mit multisampling und partieller Präsentation verwendet werden. Weitere Informationen finden Sie unter DXGI 1.4-Verbesserungen. Direct3D 11: Dieser Enumerationswert wird ab Windows 10 unterstützt. Dieses Flag gilt für eine Swap chain mit mehr als einem Backpuffer. Anwendungen verfügen jedoch nur über Lese- und Schreibzugriff auf Puffer 0.
Hinweis Windows Store-Apps müssen DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL oder DXGI_SWAP_EFFECT_FLIP_DISCARD verwenden. |
Hinweise
Diese Enumeration 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, die Bitblt-Modelle nicht. Aus diesem Grund wird multisampling a back buffer in D3D12 nicht unterstützt. Sie müssen multisampling in der App manuell mithilfe von ID3D12GraphicsCommandList::ResolveSubresource oder ID3D12GraphicsCommandList1::ResolveSubresourceRegion ausführen.
Um Multisampling mit DXGI_SWAP_EFFECT_SEQUENTIAL oder DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL zu verwenden, müssen Sie das Multisampling in einem separaten Renderziel ausführen. Erstellen Sie beispielsweise eine mehrstufige Textur, indem Sie ID3D11Device::CreateTexture2D mit einer gefüllten D3D11_TEXTURE2D_DESC-Struktur aufrufen (BindFlags-Member ist auf D3D11_BIND_RENDER_TARGET und SampleDesc-Member mit Multisampling-Parametern festgelegt). Rufen Sie als Nächstes ID3D11Device::CreateRenderTargetView auf, um eine Renderzielansicht für die Textur zu erstellen, und rendern Sie Ihre Szene in der Textur. Rufen Sie schließlich ID3D11DeviceContext::ResolveSubresource auf, um die mehrstufige Textur in Ihre Nicht-Multisampled-Swapkette aufzulösen.
Der Hauptunterschied zwischen Präsentationsmodellen besteht darin, wie Backpufferinhalte zum Desktopfenster-Manager (DWM) für die Komposition gelangen. Im Bitblt-Modell, das mit den Werten DXGI_SWAP_EFFECT_DISCARD und DXGI_SWAP_EFFECT_SEQUENTIAL verwendet wird, wird der Inhalt des Rückpuffers bei jedem Aufruf von IDXGISwapChain1::P resent1 in die Umleitungsoberfläche kopiert. Im Flip-Modell, das mit dem wert DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL verwendet wird, werden alle Backpuffer für den DWM freigegeben. Daher kann der DWM direkt aus diesen Backpuffern ohne zusätzliche Kopiervorgänge erstellen. Im Allgemeinen ist das Flip-Modell das effizientere Modell. Das Flip-Modell bietet auch weitere Features, z. B. erweiterte Gegenwartsstatistiken.
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 der einzelnen Backpuffer über Aufrufe hinweg IDXGISwapChain::Present
beibehalten wird, während DXGI_SWAP_EFFECT_FLIP_DISCARD diese Garantie nicht bietet. Der Compositor kann in bestimmten Szenarien DirectFlip verwenden, wobei er den Rückpuffer der Anwendung als gesamten Displaybackpuffer verwendet, was die Kosten für das Kopieren des Rückpuffers der Anwendung in den endgültigen Desktopbackpuffer verursacht. Mit DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL und DXGI_SWAP_EFFECT_FLIP_DISCARD kann diese Optimierung erfolgen, wenn die Anwendung das einzige auf dem Bildschirm sichtbare Element ist. Auch wenn die Anwendung nicht das einzige sichtbare Element auf dem Bildschirm DXGI_SWAP_EFFECT_FLIP_DISCARD ist, kann der Compositor in einigen Szenarien diese Optimierung dennoch durchführen, indem er andere Inhalte in den Rückpuffer der Anwendung zeichnet.
Wenn Sie IDXGISwapChain1::P resent1 in einer Flip Model Swap Chain (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) mit 0 aufrufen, die im SyncInterval-Parameter angegeben ist, entspricht das Verhalten von IDXGISwapChain1::P resent1 dem Verhalten von Direct3D 9ExIDirect3DDevice9Ex::P resentEx mit D3DSWAPEFFECT_FLIPEX und D3DPRESENT_FORCEIMMEDIATE. Das heißt, die Runtime stellt nicht nur den nächsten Frame anstelle von zuvor in die Warteschlange stehenden Frames dar, sondern beendet auch die verbleibende Zeit für die zuvor in die Warteschlange eingereihten Frames.
Unabhängig davon, ob das Flipmodell effizienter ist, kann eine Anwendung dennoch das Bitblt-Modell auswählen, da das Bitblt-Modell die einzige Möglichkeit ist, GDI- und DirectX-Präsentation zu kombinieren. Im Flip-Modell muss die Anwendung die Swapchain mit DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE erstellen und dann GetDC explizit auf dem Backpuffer verwenden. Nach dem ersten erfolgreichen Aufruf von IDXGISwapChain1::P resent1 in einer Flip-Model-Swapchain funktioniert GDI nicht mehr mit der HWND , die dieser Swap chain zugeordnet ist, auch nach der Zerstörung der Swap chain. Diese Einschränkung erstreckt sich sogar auf Methoden wie ScrollWindowEx.
Weitere Informationen zur Flipmodell-Swapchain und zur Optimierung der Präsentation finden Sie unter Verbessern der Präsentation mit dem Flip-Modell, modifiziert Rechtecke und scrollte Bereiche.
Beispiele
Um eine Swapchain in UWP zu erstellen, müssen Sie lediglich eine neue instance der DX11-Vorlage erstellen und sich die Implementierung von DeviceResources::CreateWindowSizeDependentResources
in den D3D12-Beispielen ansehen.
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 |
Weitere Informationen
Verwenden Sie das DXGI-Flipmodell, um eine optimale Leistung zu erzielen.