Aracılığıyla paylaş


Uygulamalarda hata ayıklamak için hata ayıklama katmanını kullanma

Hatalardan ve uyarılardan arındırıldığından emin olmak için uygulamalarınızda hata ayıklamak için hata ayıklama katmanı kullanmanızı öneririz. Hata ayıklama katmanı Direct3D kodu yazmanıza yardımcı olur. Ayrıca, hata ayıklama katmanını kullandığınızda üretkenliğiniz artabilir çünkü belirsiz işleme hatalarının nedenlerini ve hatta kaynaklarında siyah ekranları hemen görebilirsiniz. Hata ayıklama katmanı birçok sorun için uyarılar sağlar. Örneğin, hata ayıklama katmanı şu sorunlar için uyarılar sağlar:

  • Bir doku ayarlamayı unuttum ama piksel gölgelendiricinizde ondan okuma
  • Çıkış derinliği ancak derinlik ve şablon durumu tanımlanmamış.
  • Doku oluşturma INVALIDARG ile başarısız oldu

Burada hata ayıklama katmanının nasıl etkinleştirileceği ve hata ayıklama katmanını kullanarak önleyebileceğiniz bazı sorunlar hakkında konuşacağız.

Hata ayıklama katmanını etkinleştirme

hata ayıklama katmanını etkinleştirmek için, işleme cihazını oluşturmak için D3D11CreateDevice işlevini çağırdığınızda Bayraklar parametresinde D3D11_CREATE_DEVICE_DEBUG bayrağını belirtin. Bu örnek kod, Microsoft Visual Studio projeniz bir hata ayıklama derlemesindeyken hata ayıklama katmanının nasıl etkinleştirileceği gösterir:

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

Hata ayıklama katmanıyla uygulamanızdaki hataları önleme

Direct3D 11 API'sini kötüye kullanırsanız veya hatalı parametreler geçirirseniz, hata ayıklama katmanının hata ayıklama çıktısı bir hata veya uyarı bildirir. Daha sonra hatanızı düzeltebilirsiniz. Ardından tanımsız davranışa ve hatta işletim sisteminin kilitlenmesine neden olabilecek bazı kodlama sorunlarına göz atacağız. Hata ayıklama katmanını kullanarak bu sorunları yakalayabilir ve önleyebilirsiniz.

Haritaya NULL işaretçileri geçirmeyin

ID3D11DeviceContext::Map yönteminin pResource veya pMappedResource parametresine NULL geçirirseniz, Eşleme davranışı tanımlanmamış olur. çekirdek katmanını destekleyen bir cihaz oluşturduysanız, Map için geçersiz parametreler işletim sistemini kilitleyebilir. hata ayıklama katmanını destekleyen bir cihaz oluşturduysanız, hata ayıklama çıktısı bu geçersiz Eşleme çağrısında bir hata bildirir.

Kaynak ve hedef kaynaklar içindeki kaynak kutusunu sınırlama

ID3D11DeviceContext::CopySubresourceRegion yöntemine yapılan çağrıda, kaynak kutunun kaynak kaynağın içinde olması gerekir. Hedef uzaklıklar (x, y ve z), hedef kaynağa yazarken kaynak kutunun uzaklığını sağlar, ancak kaynak kutunun boyutları ve uzaklıklar kaynağın boyutu içinde olmalıdır. Hedef kaynağın dışına kopyalamaya veya kaynak kaynaktan daha büyük bir kaynak kutusu belirtmeye çalışırsanız, CopySubresourceRegion davranışı tanımlanmamıştır. hata ayıklama katmanını destekleyen bir cihaz oluşturduysanız, hata ayıklama çıktısı bu geçersiz CopySubresourceRegion çağrısıyla ilgili bir hata bildirir. CopySubresourceRegion için geçersiz parametreler tanımsız davranışa neden olur ve yanlış işleme, kırpma, kopya olmaması ve hatta işleme cihazının kaldırılmasına neden olabilir.

DiscardResource veya DiscardView'ı bırakmayın

Çalışma zamanı, kaynağı doğru oluşturmadığınız sürece ID3D11DeviceContext1::DiscardResource veya ID3D11DeviceContext1::DiscardView çağrısını yapmaz.

id3D11DeviceContext1::D iscardResourcegeçirdiğiniz kaynağın D3D11_USAGE_DEFAULT veya D3D11_USAGE_DYNAMICkullanılarak oluşturulmuş olması gerekir; aksi takdirde çalışma zamanı çağrıyı DiscardResource'a bırakır.

ID3D11DeviceContext1::D iscardViewgeçirdiğiniz görünümün altında yer alan kaynak, D3D11_USAGE_DEFAULT veya D3D11_USAGE_DYNAMICkullanılarak oluşturulmuş olmalıdır; aksi takdirde çalışma zamanı çağrıyı DiscardView'a bırakır.

hata ayıklama katmanını destekleyen bir cihaz oluşturduysanız, hata ayıklama çıkışı bırakılan çağrıyla ilgili bir hata bildirir.

Yazılım Katmanları