Menggunakan lapisan debug untuk men-debug aplikasi

Kami menyarankan agar Anda menggunakan lapisan debug untuk men-debug aplikasi Anda untuk memastikan bahwa mereka bersih dari kesalahan dan peringatan. Lapisan debug membantu Anda menulis kode Direct3D. Selain itu, produktivitas Anda dapat meningkat ketika Anda menggunakan lapisan debug karena Anda dapat segera melihat penyebab kesalahan penyajian yang tidak jelas atau bahkan layar hitam di sumbernya. Lapisan debug memberikan peringatan untuk banyak masalah. Misalnya, lapisan debug memberikan peringatan untuk masalah ini:

  • Lupa mengatur tekstur tetapi membacanya di shader piksel Anda
  • Kedalaman output tetapi tidak memiliki batas status stensil kedalaman
  • Pembuatan tekstur gagal dengan INVALIDARG

Di sini kita berbicara tentang cara mengaktifkan lapisan debug dan beberapa masalah yang dapat Anda cegah dengan menggunakan lapisan debug.

Mengaktifkan lapisan debug

Untuk mengaktifkan lapisan debug, tentukan bendera D3D11_CREATE_DEVICE_DEBUG di parameter Bendera saat Anda memanggil fungsi D3D11CreateDevice untuk membuat perangkat penyajian. Contoh kode ini menunjukkan cara mengaktifkan lapisan debug saat proyek Microsoft Visual Studio Anda berada dalam build 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
                )
            );

Mencegah kesalahan di aplikasi Anda dengan lapisan debug

Jika Anda menyalahgunakan API Direct3D 11 atau meneruskan parameter yang buruk, output debug lapisan debug melaporkan kesalahan atau peringatan. Anda kemudian dapat memperbaiki kesalahan Anda. Selanjutnya, kita melihat beberapa masalah pengkodean yang dapat menyebabkan perilaku yang tidak terdefinisi atau bahkan sistem operasi crash. Anda dapat menangkap dan mencegah masalah ini dengan menggunakan lapisan debug.

Jangan teruskan penunjuk NULL ke Peta

Jika Anda meneruskan NULL ke parameter pResource atau pMappedResource dari metode ID3D11DeviceContext::Map , perilaku Peta tidak terdefinisi. Jika Anda membuat perangkat yang hanya mendukung lapisan inti, parameter yang tidak valid ke Peta dapat merusak sistem operasi. Jika Anda membuat perangkat yang mendukung lapisan debug, output debug melaporkan kesalahan pada panggilan Peta yang tidak valid ini.

Kotak sumber terbatas dalam sumber daya sumber dan tujuan

Dalam panggilan ke metode ID3D11DeviceContext::CopySubresourceRegion , kotak sumber harus berada dalam sumber daya sumber. Offset tujuan, (x, y, dan z) memungkinkan kotak sumber untuk diimbangi saat menulis ke sumber daya tujuan, tetapi dimensi kotak sumber dan offset harus dalam ukuran sumber daya. Jika Anda mencoba menyalin di luar sumber daya tujuan atau menentukan kotak sumber yang lebih besar dari sumber daya sumber, perilaku CopySubresourceRegion tidak terdefinisi. Jika Anda membuat perangkat yang mendukung lapisan debug, output debug melaporkan kesalahan pada panggilan CopySubresourceRegion yang tidak valid ini. Parameter yang tidak valid ke CopySubresourceRegion menyebabkan perilaku yang tidak terdefinisi dan dapat mengakibatkan penyajian, pengklipan, tidak ada salinan, atau bahkan penghapusan perangkat penyajian yang salah.

Jangan jatuhkan BuangResource atau Buang Ringkasan

Runtime menghilangkan panggilan ke ID3D11DeviceContext1::D iscardResource atau ID3D11DeviceContext1::D iscardView kecuali Anda membuat sumber daya dengan benar.

Sumber daya yang Anda berikan ke ID3D11DeviceContext1::D iscardResource harus dibuat dengan menggunakan D3D11_USAGE_DEFAULT atau D3D11_USAGE_DYNAMIC, jika tidak, runtime menghentikan panggilan ke DiscardResource.

Sumber daya yang mendasari tampilan yang Anda berikan ke ID3D11DeviceContext1::D iscardView harus dibuat menggunakan D3D11_USAGE_DEFAULT atau D3D11_USAGE_DYNAMIC, jika tidak, runtime menghentikan panggilan ke DiscardView.

Jika Anda membuat perangkat yang mendukung lapisan debug, output debug melaporkan kesalahan mengenai panggilan yang dihentikan.

Lapisan Perangkat Lunak