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


Пошаговое руководство. Запись графических сведений программными средствами

С помощью диагностики графики Visual Studio можно программно захватывать графические данные из приложения Direct3D.

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

Программный захват в DirectX 11.2

В этой части пошагового руководства демонстрируется программный захват в приложениях, в которых применяется интерфейс API DirectX 11.2, который использует метод надежного захвата. Информацию об использовании программного захвата в приложениях, в которых применяются более ранние версии DirectX, см. в разделе Programmatic capture in DirectX 11.1 and earlier далее в этом пошаговом руководстве.

В этом разделе рассмотрены следующие задачи:

  • подготовка приложения к использованию программного захвата;

  • получение интерфейса IDXGraphicsAnalysis;

  • Захват графической информации

Примечание

В предыдущих реализациях программного захвата использовались Инструменты удаленной отладки для Visual Studio для предоставления функций захвата, но DirectX 11.2 поддерживает захват напрямую.Поэтому вам больше не нужно устанавливать Инструменты удаленной отладки для программного захвата в приложениях, в которых используется API DirectX 11.2.

Подготовка приложения к использованию программного захвата

Подготовка приложения Direct3D 11.2 к использованию программного захвата — это двухэтапный процесс. Сначала включите файлы заголовков, необходимые для программного захвата, а затем определите интерфейс IDXGraphicsAnalysis в исходном коде приложения.

Включение заголовков программного захвата

  • Включите следующие заголовки в исходный файл, в котором будет определен интерфейс IDXGraphicsAnalysis:

    #include <DXGItype.h>
    #include <dxgi1_2.h>
    #include <dxgi1_3.h>
    

    Важно!

    Не включайте файл заголовка vsgcapture.h, который поддерживает программный захват в DirectX 11.1 и более ранних версиях, для выполнения программного захвата в приложениях DirectX 11.2.Этот заголовок несовместим с DirectX 11.2.Если этот файл включен после заголовка d3d11_2, компилятор выдает предупреждение.Если файл vsgcapture.h включен перед заголовком d3d11_2, приложение не запустится.

    Примечание

    Если пакет SDK DirectX за июнь 2010 г. установлен на компьютере и путь включаемых файлов проекта содержит строку %DXSDK_DIR%include\x86, переместите ее в конец пути включаемых файлов.Сделайте то же самое для пути к библиотеке.

Определение интерфейса IDXGraphicsAnalysis

  • Определите интерфейс IDXGraphicsAnalysis в том же файле, в который вы включили файлы заголовков.

    interface DECLSPEC_UUID("9f251514-9d4d-4902-9d60-18988ab7d4b5") DECLSPEC_NOVTABLE
    IDXGraphicsAnalysis : public IUnknown
    {
        STDMETHOD_(void, BeginCapture)() PURE;
        STDMETHOD_(void, EndCapture)() PURE;
    };
    

Для удобства эти действия можно выполнить в новом файле заголовка, а затем включить его в нужном месте в приложении.

Получение интерфейса IDXGraphicsAnalysis

Чтобы получить возможность захватывать графические данные из DirectX 11.2, необходимо создать интерфейс для интерфейса отладки DXGI.

Получение интерфейса IDXGraphicsAnalysis

  • Чтобы подключить интерфейс IDXGraphicsAnalysis к интерфейсу отладки DXGI, выполните указанный ниже код.

    IDXGraphicsAnalysis* pGraphicsAnalysis;
    HRESULT getAnalysis = DXGIGetDebugInterface1(0, __uuidof(pGraphicsAnalysis), reinterpret_cast<void**>(&pGraphicsAnalysis));
    

    Проверьте значение HRESULT, возвращенное DXGIGetDebugInterface1, чтобы убедиться в том, что вы получили допустимый интерфейс перед тем, как его использовать.

    if (FAILED(getAnalysis))
    {
        // Abort program or disable programmatic capture in your app.
    }
    

    Примечание

    Если для приложения не запущена диагностика графики (ALT + F5 в Visual Studio), интерфейс DXGIGetDebugInterface1 возвращает ошибку E_NOINTERFACE: "Интерфейс не поддерживается".

Захват графической информации

Получив допустимый интерфейс IDXGraphicsAnalysis, можно использовать BeginCapture и EndCapture для захвата графических данных.

Захват графических данных

  • Чтобы начать захват графических данных, используйте BeginCapture.

    ...
    pGraphicsAnalysis->BeginCapture();
    ...
    

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

    ...
    pGraphicsAnalysis->EndCapture();
    ...
    

Программный захват в DirectX 11.1 и более ранних версиях

В этой части пошагового руководства демонстрируется программный захват в приложениях, в которых применяется интерфейс API DirectX 11.1, использующий устаревший метод захвата. Информацию об использовании программного захвата в приложениях, в которых применяется DirectX 11.2, см. в разделе Programmatic capture in DirectX 11.2 ранее в этом пошаговом руководстве.

В этом разделе рассматриваются следующие задачи:

  • подготовка компьютера к использованию программного захвата;

  • подготовка приложения к использованию программного захвата;

  • настройка имени и расположения файла журнала графики;

  • использование API CaptureCurrentFrame.

Подготовка компьютера к использованию программного захвата

API программного захвата использует Инструменты удаленной отладки для Visual Studio для предоставления функциональности захвата. На компьютере, на котором будет выполняться приложение, должны быть установлены Инструменты удаленной отладки, даже если программный захват используется на локальном компьютере. Visual Studio не следует запускать при выполнении программного захвата на локальном компьютере.

Для использования API удаленного захвата в приложении, которое работает на компьютере, необходимо сначала установить Инструменты удаленной отладки для Visual Studio на этом компьютере. Разные версии Инструментов удаленной отладки поддерживают различные аппаратные платформы. Информацию о способах установки Инструментов удаленной отладки см. на Странице загрузки Инструментов удаленной отладки веб-сайта загрузки Майкрософт.

Кроме того, Visual Studio может устанавливать необходимые компоненты для выполнения удаленного захвата для 32-разрядных приложений.

Примечание

Поскольку большинство классических приложений Windows, включая Visual Studio, не поддерживаются в Windows 8 для устройств ARM, использование Инструментов удаленной отладки для Visual Studio вместе с API программного захвата является единственным способом захвата диагностики графики на устройствах ARM.

Подготовка приложения к использованию программного захвата

Чтобы использовать средства диагностики графики, сначала нужно захватить графические данные для него. Их можно захватывать программно с помощью API CaptureCurrentFrame.

Подготовка приложения для программного захвата графических данных

  1. Убедитесь в том, что заголовок vsgcapture.h включен в исходный код приложения. Его можно включить только в одном месте, например в файле исходного кода, где будет вызываться API программного захвата, или в предварительно скомпилированном файле заголовка для вызова API из нескольких файлов исходного кода.

  2. Если нужно захватить остаток текущего кадра, в исходном коде приложения вызовите g_pVsgDbg->CaptureCurrentFrame(). Этот метод не принимает параметров и не возвращает значений.

Настройка имени и расположения файла журнала графики

Журнал графики создается в расположении, которое определяется макросами DONT_SAVE_VSGLOG_TO_TEMP и VSG_DEFAULT_RUN_FILENAME.

Настройка имени и расположения файла журнала графики

  • Чтобы предотвратить запись журнала графики во временный каталог, перед строкой #include <vsgcapture.h> добавьте следующий код:

    #define DONT_SAVE_VSGLOG_TO_TEMP
    

    С помощью этого значения можно задать запись журнала графики в расположение относительно рабочего каталога или по абсолютному пути, если определение VSG_DEFAULT_RUN_FILENAME — абсолютный путь.

  • Чтобы сохранить журнал графики в другое место или присвоить ему другое имя файла, перед строкой #include <vsgcapture.h> добавьте следующий код:

    #define VSG_DEFAULT_RUN_FILENAME <filename>
    

    Если не выполнить это действие, файл будет иметь имя default.vsglog. Если элемент DONT_SAVE_VSGLOG_TO_TEMP не определен, расположение файла является относительным к временному каталогу. В противном случае оно является относительным к рабочему каталогу или представляет собой другое расположение, если указано абсолютное имя файла.

Для приложений Магазин Windows расположение временного каталога уникально для каждого пользователя и приложения. Обычно это такое расположение, как C:\users\имя_пользователя\AppData\Local\Packages\имя_семейства_пакетов\TempState\. Для классических приложений расположение временного каталога индивидуально для каждого пользователя. Обычно это такое расположение, как C:\Users\имя_пользователя\AppData\Local\Temp\.

Примечание

Для записи в определенное расположение необходимо иметь разрешения на запись в него; в противном случае возникает ошибка.Имейте в виду, что приложения Магазин Windows имеют больше ограничений, чем классические приложения, касающиеся того, куда они могут записывать данные. Для записи в некоторые расположения может потребоваться дополнительная настройка.

Захват графических данных

Подготовив приложение для программного захвата и при необходимости настроив расположение и имя файла журнала графики, выполните сборку приложения, а затем запустите или отладьте его, чтобы захватить данные. Не запускайте диагностику графики из Visual Studio при использовании API программного захвата. Журнал графики записывается в указанное расположение. Если нужно сохранить эту версию журнала, переместите ее в другое расположение. В противном случае она будет перезаписана при повторном запуске приложения.

Совет

Во время программного захвата можно также захватывать графические данные вручную. Для этого нажмите клавишу PRINT SCREEN, когда приложение находится в фокусе.Этот прием можно использовать для захвата дополнительных графических данных, которые не захватываются с помощью API программного захвата.

Следующие действия

В этом пошаговом руководстве было продемонстрировано, как захватывать графические данные программным путем. Далее можно перейти к рассмотрению следующего этапа.

См. также

Задачи

Пошаговое руководство. Запись графических сведений

Основные понятия

Запись графических сведений