Freigeben über


Swapchains

Swapchains steuern die Drehung des Hintergrundpuffers und bilden die Grundlage der Grafikanimation.

Überblick

Das Programmiermodell für Swapchains in Direct3D 12 ist nicht identisch mit dem in früheren D3D-Versionen. Die Programmierfreundlichkeit, z. B. die Unterstützung der automatischen Ressourcendrehung, die in D3D10 und D3D11 vorhanden war, wird nicht mehr unterstützt. Die automatische Ressourcendrehung ermöglichte Apps das Rendern desselben API-Objekts, während die tatsächliche Oberfläche jedes Frames ändert. Das Verhalten von Swapchains wird mit Direct3D 12 geändert, um anderen Features von Direct3D 12 einen geringen CPU-Aufwand zu ermöglichen. Automatische Farbtasten und Multisampling werden nicht unterstützt, obwohl vor allem Dehnen und Drehung noch vorhanden sind.

Pufferlebensdauer

Apps dürfen vordefinierte Deskriptoren speichern, die auf Hintergrundpuffer verweisen. Dadurch wird sichergestellt, dass der Satz von Puffern, die einer Swapchain gehören, niemals während der Lebensdauer der Swapchain geändert wird. Der Satz von Puffern, die von IDXGISwapChain::GetBuffer zurückgegeben werden, ändert sich erst, wenn bestimmte APIs aufgerufen werden:

Die Reihenfolge der Puffer, die von GetBuffer zurückgegeben werden, sich nie ändert.

IDXGISwapChain3::GetCurrentBackBufferIndex den Index des aktuellen Hintergrundpuffers an die App zurückgibt.

Swap effects

Die einzigen unterstützten Swapeffekte sind DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL und DXGI_SWAP_EFFECT_FLIP_DISCARD, was erfordert, dass die Pufferanzahl größer als eins ist.

Übergang zwischen Fenstermodus und Vollbildmodus

Direct3D 12 unterstützt keinen exklusiven Vollbildmodus (FullScreen Exclusive Mode, FSE). Wenn ein Spiel die einzige sichtbare Anwendung auf dem Bildschirm ist, verwendet das Betriebssystem stattdessen eine Strategie namens Vollbildoptimierungen (FullScreen Optimizations, FSO), um einen ähnlichen Effekt wie FSE ohne leistungsbedingte Nachteile zu erzielen. Weitere Informationen zu FSO finden Sie unter Demystifizieren von Vollbildoptimierungen.

Direct3D 12 behält die Einschränkung bei, die Anwendungen ResizeBuffers aufrufen müssen, nach dem Übergang zwischen Fenster- und Vollbildmodi (D3D11 Flip-Modell-Swapchains haben dieselben Einschränkungen).

Die IDXGISwapChain::SetFullscreenState Übergänge ändern nicht den Satz von sichtbaren Puffern in der Swapchain. Nur die ResizeBuffers und ResizeTarget-aufrufe erstellen oder zerstören App-sichtbare Puffer. In Direct3D 12 IDXGISwapChain::SetFullscreenState wechselt jedoch nicht in den exklusiven Vollbildmodus und ändert einfach Auflösungen und Aktualisierungsraten, um Vollbildoptimierungen zu ermöglichen. Diese Änderungen können von einer App ohne die Verwendung dieser Methode vorgenommen werden.

Wenn oder IDXGISwapChain::P resent oder IDXGISwapChain1::P resent aufgerufen wird, muss sich der anzuzeigende Hintergrundpuffer im D3D12_RESOURCE_STATE_PRESENT Zustand befinden. "Present" schlägt mit DXGI_ERROR_INVALID_CALL fehl, wenn dies nicht der Fall ist.

Swapchains im Vollbildmodus verfügen weiterhin über die Einschränkung, die SetFullscreenState-(FALSE, NULL) vor der endgültigen Veröffentlichung der Swapchain aufgerufen werden muss. SetFullscreenState(FALSE) erfolgreich auf Swapchains ausgeführt wird, die auf Direct3D 12-Geräten ausgeführt werden.

Aktuelle Vorgänge treten in der 3D-Warteschlange auf, die bei der Swapchainerstellung bereitgestellt wird, und Apps können mehrere Swapchains gleichzeitig präsentieren und Befehlslisten aufzeichnen und ausführen.

Wenn der letzte Teil der Grafikarbeit (z. B. frame postprocessing) in einer Computewarteschlange ausgeführt wird oder die Grafikwarteschlange des Geräts nicht umfasst, kann das Erstellen einer zweiten 3D-Warteschlange, die aktuell ist, von Vorteil sein und verhindern, dass die Latenz der Präsentation den Start des nächsten Frames verzögert.

Beispiel

Der folgende Beispielcode wäre in der Hauptrenderingschleife vorhanden:

void Present()
{
    m_swapChain->Present(0, m_presentFlags);
    m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}

Erstellen von Swapchains

Wenn Sie die CreateSwapChainForHwnd, CreateSwapChainForCoreWindowoder CreateSwapChainForComposition Aufrufe verwenden, beachten Sie, dass der pDevice Parameter tatsächlich einen Zeiger auf eine direkte Befehlswarteschlange in Direct3D 12 erfordert und kein Gerät.

Präsentation unter Windows 7

Bei der Zielbestimmung von Direct3D 12 unter Windows 7 sind die erforderlichen DXGI-Typen für Direct3D 12 nicht vorhanden, daher müssen Sie die für die Präsentation bereitgestellte D3D12On7-ID3D12CommandQueueDownLevel (abgefragt von der direkten Befehlswarteschlange) verwenden.

Sie stellen eine offene Befehlsliste für die vorhandene Windows 7-Methode bereit, die dann für Sie verwendet, geschlossen und automatisch an das Gerät übermittelt wird. Sie müssen einen Hintergrundpuffer bereitstellen, der von der App erstellt werden muss, eine zugesicherte Ressource sein muss, ein Beispiel sein muss und eines der folgenden Formate sein muss.

  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R10G10B10A2_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_B8G8R8X8_UNORM
  • DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB