Condividi tramite


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 degli errori e degli 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 offuscati o persino schermate nere all'origine. Il livello di debug fornisce avvisi per molti problemi. Ad esempio, il livello di debug fornisce avvisi per questi problemi:

  • Dimenticata di impostare una trama ma di leggerla nel pixel shader
  • Profondità di output, ma senza stato di stencil di profondità
  • Creazione di trame non riuscita con INVALIDARG

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

Abilitazione del livello di debug

Per abilitare il livello di debug, specificare il flag D3D11_CREATE_DEVICE_DEBUG nel parametro Flags quando si chiama la funzione D3D11CreateDevice per creare il dispositivo di rendering. Questo codice di esempio illustra come abilitare il livello di debug quando il progetto di Microsoft Visual Studio è 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 utilizza 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. Si esaminano quindi alcuni problemi di codifica che possono causare un comportamento non definito o anche l'arresto anomalo del sistema operativo. È possibile rilevare e prevenire questi problemi usando il livello di debug.

Non passare puntatori NULL a Map

Se si passa NULL al parametro pResource o pMappedResource del metodo 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 è stato creato un dispositivo che supporta il livello di debug, l'output di debug segnala un errore in questa chiamata mappa non valida.

Casella di origine limite 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 specificare una casella di origine maggiore della risorsa di origine, il comportamento di CopySubresourceRegion non è definito. Se è stato creato un dispositivo che supporta il livello di debug, l'output di debug segnala un errore in questa chiamata 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 eliminare DiscardResource o DiscardView

Il runtime elimina una chiamata a ID3D11DeviceContext1::D iscardResource o ID3D11DeviceContext1::D iscardView a meno che non si crei correttamente la risorsa.

La risorsa passata a ID3D11DeviceContext1::D iscardResource 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 sottolizza la visualizzazione passata a ID3D11DeviceContext1::D iscardView deve essere stata creata usando D3D11_USAGE_DEFAULT o D3D11_USAGE_DYNAMIC, in caso contrario il runtime elimina la chiamata a DiscardView.

Se è stato creato un dispositivo che supporta il livello di debug, l'output di debug segnala un errore relativo alla chiamata eliminata.

Livelli software