Uso del livello di debug per eseguire il debug delle app

È consigliabile usare il livello di debug per eseguire il debug delle app per assicurarsi che siano puliti di errori e avvisi. Il livello di debug consente di scrivere codice Direct3D. Inoltre, la produttività può aumentare quando si usa il livello di debug perché è possibile visualizzare immediatamente le cause di errori di rendering oscura o persino schermate nere nella loro origine. Il livello di debug fornisce avvisi per molti problemi. Ad esempio, il livello di debug fornisce avvisi per questi problemi:

  • Hai dimenticato di impostare una texture, ma hai letto da essa nel tuo pixel shader.
  • Profondità di output ma senza stato depth-stencil
  • Creazione della trama non riuscita con INVALIDARG

In questo articolo viene illustrato come abilitare il livello di debug e alcuni dei problemi che è possibile prevenire usando il livello di debug.

Abilitazione del livello di debug

Per abilitare il livello di debug , specificare il flag di D3D11_CREATE_DEVICE_DEBUG nel parametro flag quando si chiama la funzioneD3D11CreateDeviceper creare il dispositivo di rendering. Questo codice di esempio illustra come abilitare il livello di debug quando il progetto di Microsoft Visual Studio si trova in una compilazione di debug:

        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
                )
            );

Prevenzione degli errori nell'app con il livello di debug

Se si usa in modo improprio l'API Direct3D 11 o si passano parametri non valido, l'output di debug del livello di debug segnala un errore o un avviso. È quindi possibile correggere l'errore. Verranno ora esaminati alcuni problemi di codifica che possono causare un comportamento non definito o persino l'arresto anomalo del sistema operativo. È possibile rilevare e prevenire questi problemi usando il livello di debug.

Non passare puntatori NULL alla mappa

Se si passa NULL al metodo pResource o pMappedResource del parametro ID3D11DeviceContext::Map, il comportamento di Map non è definito. Se è stato creato un dispositivo che supporta solo il livello principale , i parametri non validi per Map possono arrestare il sistema operativo. Se hai creato un dispositivo che supporta il livello di debug , l'output di debug segnala un errore su questa chiamata di mappa non valida.

Confinare la casella di origine all'interno delle risorse di origine e di destinazione

In una chiamata al metodo ID3D11DeviceContext::CopySubresourceRegion, la casella di origine deve trovarsi all'interno della risorsa di origine. Gli offset di destinazione, (x, y e z) consentono l'offset della casella di origine durante la scrittura nella risorsa di destinazione, ma le dimensioni della casella di origine e gli offset devono essere entro le dimensioni della risorsa. Se si tenta di copiare all'esterno della risorsa di destinazione o di specificare una casella di origine maggiore della risorsa di origine, il comportamento di CopySubresourceRegion non è definito. Se hai creato un dispositivo che supporta il livello di debug , l'output di debug segnala un errore in questa chiamata di CopySubresourceRegion non valida. I parametri non validi per CopySubresourceRegion causano un comportamento non definito e potrebbero causare rendering non corretto, ritaglio, nessuna copia o anche la rimozione del dispositivo di rendering.

Non cancellare DiscardResource o DiscardView

Il runtime elimina una chiamata a ID3D11DeviceContext1::DiscardResource o ID3D11DeviceContext1::DiscardView a meno che la risorsa non venga creata correttamente.

La risorsa passata a ID3D11DeviceContext1::DiscardResource deve essere stata creata usando D3D11_USAGE_DEFAULT o D3D11_USAGE_DYNAMIC, in caso contrario, il runtime elimina la chiamata a DiscardResource.

La risorsa che sottostà alla vista passata a ID3D11DeviceContext1::DiscardView deve essere stata creata utilizzando D3D11_USAGE_DEFAULT o D3D11_USAGE_DYNAMIC, altrimenti il runtime elimina la chiamata a DiscardView.

Se hai creato un dispositivo che supporta il livello di debug e, l'output di debug segnala un errore relativo alla chiamata interrotta.

livelli software