Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Microsoft DirectX Graphics Infrastructure (DXGI) erkennt, dass sich einige Teile von Grafiken langsamer entwickeln als andere. Das Hauptziel von DXGI ist die Verwaltung von Aufgaben auf niedriger Ebene, die unabhängig von der DirectX-Grafiklaufzeit sein können. DXGI bietet ein gemeinsames Framework für zukünftige Grafikkomponenten; Die erste Komponente, die DXGI nutzt, ist Microsoft Direct3D 10.
In früheren Versionen von Direct3D wurden Aufgaben auf niedriger Ebene wie die Aufzählung von Hardwaregeräten, das Darstellen gerenderter Frames für eine Ausgabe, die Steuerung von Gamma und die Verwaltung eines Vollbildübergangs in die Direct3D-Laufzeit aufgenommen. Diese Aufgaben werden jetzt in DXGI implementiert.
Der Zweck von DXGI besteht darin, mit dem Kernelmodustreiber und der Systemhardware zu kommunizieren, wie im folgenden Diagramm dargestellt.
Eine Anwendung kann direkt auf DXGI zugreifen oder die Direct3D-APIs in D3D11_1.h, D3D11.h, D3D10_1.h oder D3D10.h aufrufen, die die Kommunikation mit DXGI für Sie verarbeitet. Möglicherweise möchten Sie mit DXGI direkt arbeiten, wenn Ihre Anwendung Geräte aufzählen oder steuern muss, wie Daten einer Ausgabe angezeigt werden.
Dieses Thema enthält folgende Abschnitte:
- Aufzählen von Adaptern
-
Präsentation
- Erstellen einer Swapchain
- Pflege und Fütterung der Swap-Kette
- Umgang mit der Fenstergrößenanpassung
- Auswählen der DXGI-Ausgabe und -Größe
- Debuggen im Full-Screen Modus
- Zerstören einer Swapchain
- Verwenden eines gedrehten Monitors
- Modi wechseln
- Tipps zur Leistung im Vollbildmodus
- Überlegungen zu Multithreads
- DXGI-Antworten von DLLMain
- DXGI 1.1 Änderungen
- DXGI 1.2 Änderungen
- Verwandte Themen
Um anzuzeigen, welche Formate von der Direct3D 11-Hardware unterstützt werden:
- DXGI-Formatunterstützung für Direct3D-Feature-Level 12.1-Hardware
- DXGI-Formatunterstützung für Direct3D Feature Level 12.0 Hardware
- DXGI-Formatunterstützung für Direct3D-Featureebene 11.1-Hardware
- DXGI-Formatunterstützung für Direct3D-Featureebene 11.0-Hardware
- Hardwareunterstützung für Direct3D 10Level9-Formate
- Hardwareunterstützung für Direct3D 10.1-Formate
- Hardwareunterstützung für Direct3D 10-Formate
Aufzählen von Adaptern
Ein Adapter ist eine Abstraktion der Hardware und der Softwarefunktion Ihres Computers. Es gibt in der Regel viele Adapter auf Ihrem Computer. Einige Geräte werden in Hardware implementiert (z. B. Ihre Grafikkarte) und einige werden in Software implementiert (z. B. der Direct3D-Referenzrasterizer). Adapter implementieren Funktionen, die von einer Grafikanwendung verwendet werden. Das folgende Diagramm zeigt ein System mit einem einzelnen Computer, zwei Adaptern (Grafikkarten) und drei Ausgabemonitoren.
Beim Aufzählen dieser Hardwareelemente erstellt DXGI eine IDXGIOutput1-Schnittstelle für jede Ausgabe (oder jeden Monitor) und eine IDXGIAdapter2-Schnittstelle für jede Grafikkarte (auch wenn es sich um eine Grafikkarte handelt, die in eine Hauptplatine integriert ist). Aufzählung erfolgt mithilfe eines IDXGIFactory-Schnittstellenaufrufs , IDXGIFactory::EnumAdapters, um eine Reihe von IDXGIAdapter-Schnittstellen zurückzugeben, die die Videohardware darstellen.
DXGI 1.1 hat die IDXGIFactory1-Schnittstelle hinzugefügt. IDXGIFactory1::EnumAdapters1 gibt eine Reihe von IDXGIAdapter1-Schnittstellen zurück, die die Videohardware darstellen.
Wenn Sie bestimmte Videohardwarefunktionen auswählen möchten, wenn Sie Direct3D-APIs verwenden, empfehlen wir Ihnen, die D3D11CreateDevice - oder D3D11CreateDeviceAndSwapChain-Funktion mit jedem Adapterhandle und möglicher Hardwarefeatureebene iterativ aufzurufen. Diese Funktion ist erfolgreich, wenn die Featureebene vom angegebenen Adapter unterstützt wird.
Neue Informationen zum Aufzählen von Adaptern für Windows 8
Ab Windows 8 ist immer ein Adapter mit dem Namen "Microsoft Basic Render Driver" vorhanden. Dieser Adapter verfügt über eine VendorId von 0x1414 und eine DeviceID von 0x8c. Dieser Adapter hat auch den DXGI_ADAPTER_FLAG_SOFTWARE Wert im Flags-Element seiner DXGI_ADAPTER_DESC2 Struktur festgelegt. Dieser Adapter ist ein reines Rendergerät, das keine Anzeigeausgaben hat. DXGI gibt nie DXGI_ERROR_DEVICE_REMOVED für diesen Adapter zurück.
Wenn der Anzeigetreiber eines Computers nicht funktioniert oder deaktiviert ist, kann der primäre (NULL)-Adapter des Computers auch als "Microsoft Basic Render Driver" bezeichnet werden. Dieser Adapter verfügt jedoch über Ausgaben und hat nicht den DXGI_ADAPTER_FLAG_SOFTWARE Wert festgelegt. Das Betriebssystem und die Apps verwenden diesen Adapter standardmäßig. Wenn ein Anzeigetreiber installiert oder aktiviert ist, können Apps DXGI_ERROR_DEVICE_REMOVED für diesen Adapter empfangen und dann erneut Adapter aufzählen.
Wenn der primäre Anzeigeadapter eines Computers der "Microsoft Basic Display Adapter" (WARP-Adapter ) ist, verfügt dieser Computer auch über einen zweiten Adapter. Dieser zweite Adapter ist das Render-Only-Gerät, das keine Display-Ausgänge hat und für das DXGI niemals DXGI_ERROR_DEVICE_REMOVED zurückgibt.
Wenn Sie WARP zum Rendern, Berechnen oder anderen aufgaben mit langer Ausführung verwenden möchten, empfehlen wir die Verwendung des reinen Rendergeräts. Sie können einen Zeiger auf das Render-Only-Gerät abrufen, indem Sie die IDXGIFactory1::EnumAdapters1-Methode aufrufen. Außerdem erstellen Sie das rendergeschützte Gerät, wenn Sie D3D_DRIVER_TYPE_WARP im DriverType-Parameter von D3D11CreateDevice angeben, da das WARP-Gerät auch den rendergeschützten WARP-Adapter verwendet.
Präsentation
Die Aufgabe Ihrer Anwendung besteht darin, Frames zu rendern und DXGI aufzufordern, diese Frames der Ausgabe zu präsentieren. Wenn die Anwendung über zwei Puffer verfügt, kann sie einen Puffer rendern, während eine andere dargestellt wird. Die Anwendung erfordert möglicherweise mehr als zwei Puffer, je nachdem, wie lange es dauert, um einen Frame oder die gewünschte Framerate für die Präsentation zu rendern. Der erstellte Puffersatz wird als Swapchain bezeichnet, wie hier gezeigt.
- Erstellen einer Swapchain
- Pflege und Fütterung der Swap-Kette
- Umgang mit der Fenstergrößenanpassung
- Auswählen der DXGI-Ausgabe und -Größe
- Debuggen im Full-Screen Modus
- Zerstören einer Swapchain
- Verwenden eines gedrehten Monitors
- Modi wechseln
- Tipps zur Leistung im Vollbildmodus
- Überlegungen zu Multithreads
Eine Swapchain verfügt über einen Frontpuffer und einen oder mehrere Hintergrundpuffer. Jede Anwendung erstellt eine eigene Swapchain. Um die Geschwindigkeit der Darstellung der Daten in einer Ausgabe zu maximieren, wird eine Swapchain fast immer im Speicher eines Anzeigeuntersystems erstellt, das in der folgenden Abbildung dargestellt wird.
Das Display-Untersystem (das häufig eine Grafikkarte ist, aber auf einer Hauptplatine implementiert werden kann) enthält eine GPU, einen digitalen zu analogen Konverter (DAC) und Speicher. Die Swapchain wird innerhalb dieses Speichers zugewiesen, um die Präsentation sehr schnell zu gestalten. Das Anzeigeuntersystem stellt die Daten im Frontpuffer der Ausgabe dar.
Eine Swap-Kette ist so eingerichtet, dass sie im Vollbildmodus oder im Fenster-Modus gezeichnet wird. Dadurch ist es nicht erforderlich, zu wissen, ob eine Ausgabe im Fenster-Modus oder im Vollbildmodus ist. Eine Swapchain im Vollbildmodus kann die Leistung optimieren, indem sie die Anzeigeauflösung wechselt.
Erstellen einer Swapchain
Unterschiede zwischen Direct3D 9 und Direct3D 10: Direct3D 10 ist die erste Grafikkomponente, die DXGI verwendet. DXGI weist verschiedene Swapchainverhalten auf.
|
Die Puffer einer Swapchain werden in einer bestimmten Größe und in einem bestimmten Format erstellt. Die Anwendung gibt diese Werte an (oder Sie können die Größe vom Zielfenster beim Start erben), und sie können sie dann optional ändern, wenn sich die Fenstergröße als Reaktion auf Benutzereingabe- oder Programmereignisse ändert.
Nachdem Sie die Swapchain erstellt haben, möchten Sie in der Regel Bilder darin rendern. Hier ist ein Codefragment, das einen Direct3D-Kontext zum Rendern in eine Swap-Chain einrichtet. Dieser Code extrahiert einen Puffer aus der Swapchain, erstellt eine Renderzielansicht aus diesem Puffer und legt ihn dann auf dem Gerät fest:
ID3D11Resource * pBB;
ThrowFailure( pSwapChain->GetBuffer(0, __uuidof(pBB),
reinterpret_cast<void**>(&pBB)), "Couldn't get back buffer");
ID3D11RenderTargetView * pView;
ThrowFailure( pD3D11Device->CreateRenderTargetView(pBB, NULL, &pView),
"Couldn't create view" );
pD3D11DeviceContext->OMSetRenderTargets(1, &pView, 0);
Nachdem Ihre Anwendung einen Frame in einen Swap-Ketten-Puffer gerendert hat, rufen Sie IDXGISwapChain1::Present1 auf. Die Anwendung kann dann das nächste Bild rendern.
Pflege und Verwaltung der Swap-Kette
Rufen Sie nach dem Rendern des Bilds IDXGISwapChain1::P resent1 auf, und rendern Sie das nächste Bild. Das ist der Umfang Ihrer Verantwortung.
Wenn Sie zuvor IDXGIFactory::MakeWindowAssociation genannt haben, kann der Benutzer die tastenkombination Alt-Enter drücken, und DXGI wechselt ihre Anwendung zwischen Fenstern und Vollbildmodus. IDXGIFactory::MakeWindowAssociation wird empfohlen, da ein Standardkontrollmechanismus vom Benutzer dringend gewünscht wird.
Sie müssen zwar nicht mehr Code schreiben, als beschrieben wurde, aber einige einfache Schritte können Ihre Anwendung reaktionsfähiger machen. Am wichtigsten ist die Größenänderung der Swap-Chain-Puffer in Reaktion auf die Größenänderung des Ausgabefensters. Natürlich besteht die beste Route der Anwendung darin, auf WM_SIZE zu reagieren und IDXGISwapChain::ResizeBuffers aufzurufen und die Größe der Parameter der Nachricht zu übergeben. Mit diesem Verhalten reagiert Ihre Anwendung offensichtlich gut auf den Benutzer, wenn er die Rahmen des Fensters zieht, aber es ist auch genau das, was einen reibungslosen Vollbildübergang ermöglicht. Ihr Fenster erhält eine WM_SIZE Nachricht, wenn ein solcher Übergang erfolgt, und das Aufrufen von IDXGISwapChain::ResizeBuffers bietet die Möglichkeit, den Speicherplatz der Puffer für eine optimale Präsentation neu zuzuweisen. Aus diesem Grund muss die Anwendung alle Verweise freigeben, die sie auf den vorhandenen Puffern hat, bevor sie IDXGISwapChain::ResizeBuffers aufruft.
Fehler beim Aufrufen von IDXGISwapChain::ResizeBuffers als Reaktion auf den Wechsel zum Vollbildmodus (in Reaktion auf WM_SIZE) kann die Optimierung des Kippens ausschließen, wobei DXGI einfach austauschen kann, welcher Puffer angezeigt wird, anstatt die Daten im Vollbildmodus zu kopieren.
IDXGISwapChain1::Present1 informiert Sie darüber, ob Ihr Ausgabefenster vollständig durch DXGI_STATUS_OCCLUDED verdeckt ist. In diesem Fall wird empfohlen, dass Ihre Anwendung in den Standbymodus wechselt (durch Aufrufen von IDXGISwapChain1::P resent1 mit DXGI_PRESENT_TEST), da Ressourcen, die zum Rendern des Frames verwendet werden, verschwendet werden. Die Verwendung von DXGI_PRESENT_TEST verhindert, dass Daten angezeigt werden, während die Okklusionsprüfung noch ausgeführt wird. Sobald IDXGISwapChain1::P resent1 S_OK zurückgibt, sollten Sie den Standbymodus beenden; Verwenden Sie nicht den Rückgabecode, um in den Standbymodus zu wechseln, sodass die Swapchain nicht in der Lage sein kann, den Vollbildmodus zurückzugeben.
Die Direct3D 11.1-Runtime, die ab Windows 8 verfügbar ist, bietet eine Flip-Model-Swap-Chain, das heißt, eine Swap-Chain, die den Wert DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL im SwapEffect-Element von DXGI_SWAP_CHAIN_DESC oder DXGI_SWAP_CHAIN_DESC1 festgelegt hat. Wenn Sie Frames mit einer Flip-Model-Swapchain auf einem Ausgabeziel präsentieren, bindet DXGI den Backbuffer von allen Pipeline-Status-Lokationen ab, wie bei einem Output-Merger-Renderziel, die in Backbuffer 0 schreiben. Daher wird empfohlen, ID3D11DeviceContext::OMSetRenderTargets unmittelbar vor dem Rendern zum Back Buffer aufzurufen. Rufen Sie z. B. omSetRenderTargets nicht auf, und führen Sie dann Compute-Shader-Arbeit aus, die nicht zum Rendern der Ressource führt. Weitere Informationen zu Flip-Modell-Swapchains und deren Vorteilen finden Sie unter DXGI Flip Model.
Hinweis
In Direct3D 10 und Direct3D 11 müssen Sie idXGISwapChain::GetBuffer nicht aufrufen, um den Hintergrundpuffer 0 abzurufen, nachdem Sie IDXGISwapChain1::P resent1 aufgerufen haben, da sich die Identitäten von Hintergrundpuffern aufgrund der Einfachheit ändern. Dies geschieht nicht in Direct3D 12, und Ihre Anwendung muss stattdessen pufferindizes manuell nachverfolgen.
Umgang mit Fenstergrößenänderungen
Sie können die IDXGISwapChain::ResizeBuffers-Methode verwenden, um die Fenstergröße zu behandeln. Bevor Sie ResizeBuffers aufrufen, müssen Sie alle ausstehenden Verweise auf die Swap-Chain-Puffer freigeben. Das Objekt, das in der Regel einen Verweis auf den Puffer einer Swapchain enthält, ist eine Renderzielansicht.
Der folgende Beispielcode zeigt, wie ResizeBuffers aus dem WindowProc-Handler für WM_SIZE Nachrichten aufgerufen werden:
case WM_SIZE:
if (g_pSwapChain)
{
g_pd3dDeviceContext->OMSetRenderTargets(0, 0, 0);
// Release all outstanding references to the swap chain's buffers.
g_pRenderTargetView->Release();
HRESULT hr;
// Preserve the existing buffer count and format.
// Automatically choose the width and height to match the client rect for HWNDs.
hr = g_pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0);
// Perform error handling here!
// Get buffer and create a render-target-view.
ID3D11Texture2D* pBuffer;
hr = g_pSwapChain->GetBuffer(0, __uuidof( ID3D11Texture2D),
(void**) &pBuffer );
// Perform error handling here!
hr = g_pd3dDevice->CreateRenderTargetView(pBuffer, NULL,
&g_pRenderTargetView);
// Perform error handling here!
pBuffer->Release();
g_pd3dDeviceContext->OMSetRenderTargets(1, &g_pRenderTargetView, NULL );
// Set up the viewport.
D3D11_VIEWPORT vp;
vp.Width = width;
vp.Height = height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
g_pd3dDeviceContext->RSSetViewports( 1, &vp );
}
return 1;
DXGI-Ausgabe und -Größe auswählen
Standardmäßig wählt DXGI die Ausgabe aus, die den größten Teil des Clientbereichs des Fensters enthält. Dies ist die einzige Option, die DXGI zur Verfügung steht, wenn es als Reaktion auf Alt+Enter den Vollbildmodus aktiviert. Wenn die Anwendung selbst in den Vollbildmodus wechselt, kann sie IDXGISwapChain::SetFullscreenState aufrufen und eine explizite IDXGIOutput1 (oder NULL) übergeben, wenn die Anwendung damit einverstanden ist, dass DXGI entscheidet.
Um die Größe der Ausgabe während des Vollbildmodus oder der Fenstergröße zu ändern, empfehlen wir, IDXGISwapChain::ResizeTarget aufzurufen, da diese Methode auch die Größe des Zielfensters ändert. Da die Größe des Zielfensters geändert wird, sendet das Betriebssystem WM_SIZE, und Ihr Code ruft natürlich IDXGISwapChain::ResizeBuffers als Antwort auf. Es ist daher eine Verschwendung von Aufwand, die Größe der Puffer zu ändern und anschließend die Größe des Ziels zu ändern.
Debuggen im Vollbildmodus
Eine DXGI-Swapchain verzichtet nur dann auf den Vollbildmodus, wenn es unbedingt erforderlich ist. Dies bedeutet, dass Sie eine Vollbildanwendung mit mehreren Monitoren debuggen können, solange das Debugfenster das Zielfenster der Swapchain nicht überlappt. Alternativ können Sie den Moduswechsel vollständig verhindern, indem Sie das DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH-Flag nicht festlegen.
Wenn ein Moduswechsel erlaubt ist, gibt eine Swapchain den Vollbildmodus auf, sobald ihr Ausgabefenster von einem anderen Fenster verdeckt wird. Die Okklusionsprüfung wird während IDXGISwapChain1::Present1 oder von einem separaten Thread ausgeführt, dessen Zweck darin besteht, zu überwachen, ob die Anwendung nicht mehr reagiert (und IDXGISwapChain1::Present1 nicht mehr aufruft). Um zu verhindern, dass der separate Thread eine Umschaltung verursacht, legen Sie den folgenden Registrierungsschlüssel auf einen beliebigen Wert ungleich Null fest.
HKCU\Software\Microsoft\DXGI\DisableFullscreenWatchdog
Zerstören einer Swapchain
Sie dürfen eine Swapchain im Vollbildmodus nicht freigeben, da dies zu Thread-Konflikten führen kann, was dazu führt, dass DXGI eine nicht fortsetzbare Ausnahme auslöst. Bevor Sie eine Swapchain freigeben, wechseln Sie zuerst zum Fenstermodus (mit IDXGISwapChain::SetFullscreenState( FALSE, NULL )), und rufen Sie dann IUnknown::Release auf.
Verwenden eines gedrehten Monitors
Eine Anwendung muss sich nicht um die Bildschirmausrichtung kümmern, DXGI dreht bei Bedarf einen Swapchainpuffer während der Präsentation. Diese zusätzliche Drehung kann sich natürlich auf die Leistung auswirken. Um eine optimale Leistung zu erzielen, kümmern Sie sich um die Drehung in Ihrer Anwendung, indem Sie die folgenden Schritte ausführen:
- Verwenden Sie die DXGI_SWAP_CHAIN_FLAG_NONPREROTATED. Dadurch wird DXGI benachrichtigt, dass die Anwendung ein gedrehtes Bild erzeugt (z. B. durch Ändern der Projektionsmatrix). Beachten Sie, dass dieses Kennzeichen nur im Vollbildmodus gültig ist.
- Weisen Sie jedem Swap-Chain-Puffer seine gedrehte Größe zu. Verwenden Sie IDXGIOutput::GetDesc , um diese Werte bei Bedarf abzurufen.
Indem Sie die Drehung in Ihrer Anwendung durchführen, führt DXGI eine Kopie anstelle einer Kopie und Drehung durch.
Die Direct3D 11.1-Laufzeit, die ab Windows 8 verfügbar ist, stellt eine Flipmodell-Swapchain bereit (d. h. eine Swapchain, die den DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL Wert im SwapEffect-Element von DXGI_SWAP_CHAIN_DESC1 festgelegt hat). Um die verfügbaren Präsentationsoptimierungen mit einer Flip-Modell-Swapchain zu maximieren, empfehlen wir, dass Ihre Anwendungen Inhalte so ausrichten, dass sie mit der jeweiligen Ausgabe übereinstimmen, auf der sich der Inhalt befindet, wenn dieser Inhalt die Ausgabe vollständig belegt. Weitere Informationen zu Flip-Modell-Swapchains und deren Vorteilen finden Sie unter DXGI Flip Model.
Wechseln zwischen Modi
Die DXGI-Swapchain kann den Anzeigemodus einer Ausgabe ändern, wenn ein Vollbildübergang vorgenommen wird. Um die Änderung des automatischen Anzeigemodus zu aktivieren, müssen Sie DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH in der Swapchainbeschreibung angeben. Wenn sich der Anzeigemodus automatisch ändert, wählt DXGI den am wenigsten anspruchsvollen Modus aus (Größe und Auflösung ändern sich nicht, die Farbtiefe kann sich jedoch ändern). Das Ändern der Größe von Swapchainpuffern führt nicht zu einem Moduswechsel. Die Swapchain macht eine implizite Zusage, dass wenn Sie einen Hintergrundpuffer auswählen, der exakt mit einem anzeigemodus übereinstimmt, der von der Zielausgabe unterstützt wird, dann wechselt sie in diesen Anzeigemodus, wenn Sie den Vollbildmodus auf dieser Ausgabe eingeben. Daher wählen Sie einen Anzeigemodus aus, indem Sie die Größe und das Format des Hintergrundpuffers auswählen.
Tipp zur Vollbildleistung
Wenn Sie IDXGISwapChain1::P resent1 für eine Vollbildanwendung aufrufen, kippt die Swapchain den Inhalt des Hintergrundpuffers in den Frontpuffer. Dies erfordert, dass die Swapchain mithilfe eines aufgezählten Anzeigemodus erstellt wurde (angegeben in DXGI_SWAP_CHAIN_DESC1). Wenn Sie die Anzeigemodi nicht aufzählen oder den Anzeigemodus in der Beschreibung falsch angeben, kann die Swapchain stattdessen eine Bitblockübertragung (Bitblt) durchführen. Die Bitblt-Operation verursacht eine zusätzliche Streckungskopie sowie eine erhöhte Nutzung des Videospeichers und ist schwer zu erkennen und zu lokalisieren. Um dieses Problem zu vermeiden, führen Sie Anzeigemodi auf, und initialisieren Sie die Swapchainbeschreibung ordnungsgemäß, bevor Sie die Swapchain erstellen. Dadurch wird eine maximale Leistung beim Kippen im Vollbildmodus gewährleistet und der zusätzliche Arbeitsspeicheraufwand vermieden.
Überlegungen zu Multithreads
Wenn Sie DXGI in einer Anwendung mit mehreren Threads verwenden, müssen Sie vorsichtig sein, um das Erstellen eines Deadlocks zu vermeiden, bei dem zwei verschiedene Threads auf den Abschluss warten. Es gibt zwei Situationen, in denen dies auftreten kann.
- Der Renderingthread ist nicht der Message-Pump-Thread.
- Der Thread, der eine DXGI-API ausführt, ist nicht derselbe Thread, der das Fenster erstellt hat.
Achten Sie darauf, dass der Nachrichtenpumpenthread nie auf den Renderthread wartet, wenn Sie Swapchains im Vollbildmodus verwenden. Beispielsweise kann das Aufrufen von IDXGISwapChain1::P resent1 (aus dem Renderthread) dazu führen, dass der Renderthread auf den Nachrichtenpumpenthread wartet. Wenn eine Modusänderung auftritt, ist dieses Szenario möglich, wenn Present1 ::SetWindowPos() oder ::SetWindowStyle() aufruft und eine dieser Methoden ::SendMessage() aufruft. In diesem Szenario, wenn der Nachrichtenpumpen-Thread einen kritischen Abschnitt hat, der ihn schützt, oder wenn der Render-Thread blockiert ist, kommt es zu einem Deadlock zwischen den beiden Threads.
Weitere Informationen zur Verwendung von DXGI mit mehreren Threads finden Sie unter Multithreading und DXGI.
DXGI-Antworten von DLLMain
Da eine DllMain-Funktion die Reihenfolge, in der dlLs geladen und entladen werden, nicht garantieren kann, empfehlen wir, dass die DllMain-Funktion Ihrer App keine Direct3D- oder DXGI-Funktionen oder -Methoden aufruft, einschließlich Funktionen oder Methoden, die Objekte erstellen oder freigeben. Wenn die DllMain-Funktion Ihrer App in eine bestimmte Komponente aufruft, ruft diese Komponente möglicherweise eine andere DLL auf, die nicht auf dem Betriebssystem vorhanden ist, was dazu führt, dass das Betriebssystem abstürzt. Direct3D und DXGI können eine Reihe von DLLs laden, in der Regel eine Reihe von Treibern, die sich von Computer zu Computer unterscheiden. Selbst wenn Ihre App nicht auf Ihren Entwicklungs- und Testcomputern abstürzt, wenn ihre DllMain-Funktion Direct3D- oder DXGI-Funktionen oder -Methoden aufruft, kann sie beim Ausführen auf einem anderen Computer abstürzen.
Um zu verhindern, dass Sie eine App erstellen, die dazu führen kann, dass das Betriebssystem abstürzt, stellt DXGI die folgenden Antworten in den angegebenen Situationen bereit:
- Wenn die DllMain-Funktion ihrer App den letzten Verweis auf eine DXGI-Factory freigibt, löst DXGI eine Ausnahme aus.
- Wenn die DllMain-Funktion Ihrer App eine DXGI-Factory erstellt, gibt DXGI einen Fehlercode zurück.
DXGI 1.1-Änderungen
Wir haben die folgenden Funktionen in DXGI 1.1 hinzugefügt.
Unterstützung für synchronisierte geteilte Flächen
Synchronisierte gemeinsam genutzte Oberflächen für Direct3D 10.1 und Direct3D 11 ermöglichen eine effiziente Lese- und Schreiboberflächenfreigabe zwischen mehreren Direct3D-Geräten (freigabe zwischen Direct3D 10- und Direct3D 11-Geräten ist möglich). Siehe IDXGIKeyedMutex::AcquireSync und IDXGIKeyedMutex::ReleaseSync.
Hohe Farbunterstützung
Unterstützt das DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM-Format.
IDXGIDevice1::SetMaximumFrameLatency und IDXGIDevice1::GetMaximumFrameLatency
IDXGIFactory1::EnumAdapters1 listet lokale Adapter(n) ohne angeschlossene Monitore oder Ausgaben sowie Adapter mit angeschlossenen Ausgängen auf. Der erste zurückgegebene Adapter ist der lokale Adapter, auf dem der primäre Desktop angezeigt wird.
Unterstützung des BGRA-Formats
DXGI_FORMAT_B8G8R8A8_UNORM und DXGI_FORMAT_B8G8R8A8_UNORM_SRGB finden Sie unter IDXGISurface1::GetDC und IDXGISurface1::ReleaseDC.
DXGI 1.2 Änderungen
Wir haben die folgenden Funktionen in DXGI 1.2 hinzugefügt.
- Stereo-Swapkette
- Flipmodell-Swapchain
- Optimierte Präsentation (Bildlauf, schmutzige Rechtecke und Drehung)
- Verbesserte freigegebene Ressourcen und Synchronisierung
- Desktop-Spiegelung
- Optimierte Verwendung des Videospeichers
- Unterstützung für 16 Bit pro Pixel (bpp)-Formaten (DXGI_FORMAT_B5G6R5_UNORM, DXGI_FORMAT_B5G5R5A1_UNORM, DXGI_FORMAT_B4G4R4A4_UNORM)
- Debuggen von APIs
Weitere Informationen zu DXGI 1.2 finden Sie unter DXGI 1.2 Verbesserungen.
Anwendungskompatibilität
DXGI kann Anwendungsverhaltensänderungen anwenden, um die Anwendungskompatibilität zu verbessern.
- Kompatibilitätseinstellungen können in der Benutzerregistrierung unter
HKCU\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AppCompatFlags\Layersgespeichert werden. - Kompatibilitätseinstellungen können je nach Systemkonfiguration oder anderen Faktoren möglicherweise angewendet oder nicht angewendet werden.
- Ein Beispiel für anwendungskompatibilitätseinstellung ist
DXAllowModeChangeOnLaunch720.