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


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

Мы рекомендуем использовать уровень отладки для отладки приложений, чтобы обеспечить очистку ошибок и предупреждений. Слой отладки помогает писать код 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 в карту

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

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

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

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

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

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

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

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

Программные слои