Share via


Verwenden der Debugebene zum Debuggen von Apps

Es wird empfohlen, die Debugebene zum Debuggen Ihrer Apps zu verwenden, um sicherzustellen, dass sie sauber von Fehlern und Warnungen sind. Die Debugebene hilft Ihnen beim Schreiben von Direct3D-Code. Darüber hinaus kann Ihre Produktivität steigen, wenn Sie die Debugebene verwenden, da Sie sofort die Ursachen für obskure Renderingfehler oder sogar schwarze Bildschirme an der Quelle erkennen können. Die Debugebene bietet Warnungen für viele Probleme. Die Debugebene enthält z. B. Warnungen für folgende Probleme:

  • Haben Sie vergessen, eine Textur festzulegen, aber in Ihrem Pixel-Shader gelesen.
  • Ausgabetiefe, aber ohne Tiefenschablonenzustand
  • Fehler bei der Texturerstellung mit INVALIDARG

Hier erfahren Sie, wie Sie die Debugebene aktivieren, und einige der Probleme, die Sie mithilfe der Debugebene verhindern können.

Aktivieren der Debugebene

Um die Debugebene zu aktivieren, geben Sie das flag D3D11_CREATE_DEVICE_DEBUG im Flags-Parameter an, wenn Sie die D3D11CreateDevice-Funktion aufrufen, um das Renderinggerät zu erstellen. Dieser Beispielcode zeigt, wie Sie die Debugebene aktivieren, wenn sich Ihr Microsoft Visual Studio-Projekt in einem Debugbuild befindet:

        UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
#if defined(_DEBUG)
        // If the project is in a debug build, enable the debug layer.
        creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
        // Define the ordering of feature levels that Direct3D attempts to create.
        D3D_FEATURE_LEVEL featureLevels[] =
        {
            D3D_FEATURE_LEVEL_11_1,
            D3D_FEATURE_LEVEL_11_0,
            D3D_FEATURE_LEVEL_10_1,
            D3D_FEATURE_LEVEL_10_0,
            D3D_FEATURE_LEVEL_9_3,
            D3D_FEATURE_LEVEL_9_1
        };

        ComPtr<ID3D11Device> d3dDevice;
        ComPtr<ID3D11DeviceContext> d3dDeviceContext;
        DX::ThrowIfFailed(
            D3D11CreateDevice(
                nullptr,                    // specify nullptr to use the default adapter
                D3D_DRIVER_TYPE_HARDWARE,
                nullptr,                    // specify nullptr because D3D_DRIVER_TYPE_HARDWARE 
                                            // indicates that this function uses hardware
                creationFlags,              // optionally set debug and Direct2D compatibility flags
                featureLevels,
                ARRAYSIZE(featureLevels),
                D3D11_SDK_VERSION,          // always set this to D3D11_SDK_VERSION
                &d3dDevice,
                nullptr,
                &d3dDeviceContext
                )
            );

Verhindern von Fehlern in Ihrer App mit der Debugebene

Wenn Sie die Direct3D 11-API missbrauchen oder fehlerhafte Parameter übergeben, meldet die Debugausgabe der Debugebene einen Fehler oder eine Warnung. Anschließend können Sie Ihren Fehler korrigieren. Als Nächstes untersuchen wir einige Codierungsprobleme, die dazu führen können, dass nicht definiertes Verhalten oder sogar das Betriebssystem abstürzt. Sie können diese Probleme mithilfe der Debugebene abfangen und verhindern.

Übergeben Sie null-Zeiger nicht an Map

Wenn Sie NULL an den pResource - oder pMappedResource-Parameter der ID3D11DeviceContext::Map-Methode übergeben, ist das Verhalten von Map nicht definiert. Wenn Sie ein Gerät erstellt haben, das nur die Kernebene unterstützt, können ungültige Parameter für Map das Betriebssystem abstürzen. Wenn Sie ein Gerät erstellt haben, das die Debugebene unterstützt, meldet die Debugausgabe einen Fehler für diesen ungültigen Map-Aufruf .

Einschränken des Quellfelds in Quell- und Zielressourcen

Bei einem Aufruf der ID3D11DeviceContext::CopySubresourceRegion-Methode muss sich das Quellfeld innerhalb der Quellressource befinden. Mit den Zieloffsets (x, y und z) kann das Quellfeld beim Schreiben in die Zielressource ver offsett werden, aber die Dimensionen des Quellfelds und der Offsets müssen innerhalb der Größe der Ressource sein. Wenn Sie versuchen, außerhalb der Zielressource zu kopieren oder ein Quellfeld anzugeben, das größer als die Quellressource ist, ist das Verhalten von CopySubresourceRegion nicht definiert. Wenn Sie ein Gerät erstellt haben, das die Debugebene unterstützt, meldet die Debugausgabe einen Fehler für diesen ungültigen CopySubresourceRegion-Aufruf . Ungültige Parameter für CopySubresourceRegion führen zu undefiniertem Verhalten und können zu falschem Rendering, Ausschneiden, keine Kopie oder sogar zum Entfernen des Renderinggeräts führen.

Verwerfen Sie nicht DiscardResource oder DiscardView

Die Runtime legt einen Aufruf von ID3D11DeviceContext1::D iscardResource oder ID3D11DeviceContext1::D iscardView ab, es sei denn, Sie haben die Ressource ordnungsgemäß erstellt.

Die Ressource, die Sie an ID3D11DeviceContext1::D iscardResource übergeben, muss mithilfe von D3D11_USAGE_DEFAULT oder D3D11_USAGE_DYNAMIC erstellt worden sein. Andernfalls setzt die Runtime den Aufruf von DiscardResource ab.

Die Ressource, die der Ansicht zugrunde steht, die Sie an ID3D11DeviceContext1::D iscardView übergeben, muss mit D3D11_USAGE_DEFAULT oder D3D11_USAGE_DYNAMIC erstellt worden sein. Andernfalls wird von der Runtime der Aufruf von DiscardView gelöscht.

Wenn Sie ein Gerät erstellt haben, das die Debugebene unterstützt, meldet die Debugausgabe einen Fehler in Bezug auf den gelöschten Aufruf.

Softwareebenen