共用方式為


使用偵錯層對應用程式進行偵錯

我們建議您使用 偵錯層 來偵錯您的應用程式,以確保它們已清除錯誤和警告。 偵錯層可協助您撰寫 Direct3D 程式碼。 此外,當您使用偵錯層時,您的生產力可能會增加,因為您可以立即看到隱藏轉譯錯誤的原因,或甚至在其來源看到黑色螢幕的原因。 偵錯層會針對許多問題提供警告。 例如,偵錯層會提供這些問題的警告:

  • 忘記設定紋理,但在圖元著色器中讀取紋理
  • 輸出深度,但沒有深度樣板狀態系結
  • 使用 INVALIDARG 建立紋理失敗

在這裡,我們將討論如何啟用 偵錯層 ,以及您可以使用偵錯層來防止的一些問題。

啟用偵錯層

若要啟用偵錯層,請在呼叫D3D11CreateDevice函式以建立轉譯裝置時,在Flags參數中指定D3D11_CREATE_DEVICE_DEBUG旗標。 此範例程式碼示範如何在 Microsoft Visual Studio 專案位於偵錯組建時啟用偵錯層:

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

使用偵錯層防止應用程式中的錯誤

如果您誤用 Direct3D 11 API 或傳遞不正確的參數,偵錯 的偵錯輸出會報告錯誤或警告。 然後,您可以更正錯誤。 接下來,我們會探討一些可能導致未定義行為或甚至作業系統損毀的程式碼問題。 您可以使用偵錯層攔截並防止這些問題。

不要將 Null 指標傳遞至 Map

如果您將Null傳遞至ID3D11DeviceCoNtext::Map方法的pResourcepMappedResource參數,則 Map的行為是未定義的。 如果您建立了只支援 核心層的裝置, 對應 的參數無效可能會損毀作業系統。 如果您建立了支援 偵錯層的裝置,偵錯輸出會在這個不正確 Map 呼叫上回報錯誤。

來源和目的地資源內的限制來源方塊

在對 ID3D11DeviceCoNtext::CopySubresourceRegion 方法的呼叫中,來源方塊必須位於來源資源內。 目的地位移、 (x、y 和 z) 允許在寫入目的地資源時位移來源方塊,但來源方塊和位移的維度必須位於資源的大小內。 如果您嘗試在目的地資源外部複製,或指定大於來源資源的來源方塊, 則 CopySubresourceRegion 的行為未定義。 如果您建立了支援 偵錯層的裝置,偵錯輸出會在這個不正確 CopySubresourceRegion 呼叫上回報錯誤。 CopySubresourceRegion的參數無效會導致未定義的行為,而且可能會導致轉譯、裁剪、沒有複製或甚至移除轉譯裝置。

不要卸載 DiscardResource 或 DiscardView

除非您正確建立資源,否則執行時間會卸載 對 ID3D11DeviceCoNtext1::D iscardResourceID3D11DeviceCoNtext1::D iscardView 的呼叫。

您傳遞至 ID3D11DeviceCoNtext1::D iscardResource 的資源必須使用 D3D11_USAGE_DEFAULTD3D11_USAGE_DYNAMIC來建立,否則執行時間會卸載 對 DiscardResource的呼叫。

您傳遞至 ID3D11DeviceCoNtext1::D iscardView 的資源必須已使用 D3D11_USAGE_DEFAULTD3D11_USAGE_DYNAMIC來建立,否則執行時間會卸載 對 DiscardView的呼叫。

如果您建立了支援 偵錯層的裝置,偵錯輸出會報告有關已卸載呼叫的錯誤。

軟體層