Поделиться через


Использование уровня отладки для отладки приложений

Мы рекомендуем использовать отладочный уровень для отладки приложений, чтобы обеспечить их очистку от ошибок и предупреждений. Уровень отладки помогает писать код Direct3D. Кроме того, производительность может повыситься при использовании уровня отладки, так как вы сразу же можете увидеть причины неясных ошибок отрисовки или даже черных экранов в их источнике. Уровень отладки предоставляет предупреждения для многих проблем. Например, уровень отладки предоставляет предупреждения для следующих проблем:

  • Забыл задать текстуру, но считывать из нее в пиксельном шейдере
  • Глубина вывода, но состояние трафарета глубины не привязано
  • Сбой создания текстуры с ошибкой INVALIDARG

Здесь мы поговорим о том, как включить уровень отладки , и о некоторых проблемах, которые можно предотвратить с помощью слоя отладки.

Включение уровня отладки

Чтобы включить уровень отладки, укажите флаг D3D11_CREATE_DEVICE_DEBUG в параметре Flags при вызове функции D3D11CreateDevice для создания устройства отрисовки. В этом примере кода показано, как включить уровень отладки, когда проект 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
                )
            );

Предотвращение ошибок в приложении с помощью уровня отладки

Если вы неправильно используете API Direct3D 11 или передаете неправильные параметры, выходные данные отладки уровня отладки сообщают об ошибке или предупреждении. После этого вы сможете исправить свою ошибку. Далее мы рассмотрим некоторые проблемы с написанием кода, которые могут привести к неопределенному поведению или даже к сбою операционной системы. Эти проблемы можно перехватывать и предотвращать с помощью уровня отладки.

Не передайте указатели NULL в map

Если передать значение NULL в параметр pResource или pMappedResource метода ID3D11DeviceContext::Map , поведение Map будет неопределенным. Если вы создали устройство, которое поддерживает только основной уровень, недопустимые параметры для сопоставления могут завершить работу операционной системы. Если вы создали устройство, поддерживающее уровень отладки, выходные данные отладки сообщают об ошибке при этом недопустимом вызове map .

Ограничить поле источника в исходном и целевом ресурсах

При вызове метода ID3D11DeviceContext::CopySubresourceRegion поле источника должно находиться в исходном ресурсе. Конечные смещения (x, y и z) позволяют смещению исходного поля при записи в целевой ресурс, но размеры исходного поля и смещения должны быть в пределах размера ресурса. Если попытаться скопировать за пределы целевого ресурса или указать поле источника, которое больше исходного ресурса, поведение CopySubresourceRegion будет неопределенным. Если вы создали устройство, поддерживающее уровень отладки, выходные данные отладки сообщают об ошибке при этом недопустимом вызове CopySubresourceRegion . Недопустимые параметры для CopySubresourceRegion приводят к неопределенному поведению и могут привести к неправильной отрисовке, обрезке, без копирования или даже удалению устройства отрисовки.

Не удалять DiscardResource или DiscardView

Среда выполнения удаляет вызов ID3D11DeviceContext1::D iscardResource или ID3D11DeviceContext1::D iscardView , если вы не создали ресурс правильно.

Ресурс, который передается в ID3D11DeviceContext1::D iscardResource , должен быть создан с помощью D3D11_USAGE_DEFAULT или D3D11_USAGE_DYNAMIC, в противном случае среда выполнения отменит вызов DiscardResource.

Ресурс, лежащий в основе представления, передаваемого в ID3D11DeviceContext1::D iscardView , должен быть создан с помощью D3D11_USAGE_DEFAULT или D3D11_USAGE_DYNAMIC, в противном случае среда выполнения отменит вызов DiscardView.

Если вы создали устройство, поддерживающее уровень отладки, выходные данные отладки сообщают об ошибке, связанной с отброшенным вызовом.

Уровни программного обеспечения