Partilhar via


Instruções passo a passo: capturando informações de gráfico de forma programática

É possível usar o Diagnóstico de Gráficos do Visual Studio para capturar de forma programática informações gráficas de um aplicativo Direct3D.

A captura programática é especialmente útil para depurar sombradores de cálculo em programas que jamais chamam Present ou quando é difícil prever um problema de renderização e capturá-lo em testes manuais, embora seja possível prevê-lo de forma programática usando informações sobre o estado do aplicativo no tempo de execução.

Captura programática no DirectX 11.2

Esta parte do passo a passo demonstra a captura programática em aplicativos que usam a API do DirectX 11.2, que usa o método de captura robusto. Para obter informações sobre como usar a captura programática em aplicativos que usam versões anteriores do DirectX, consulte Programmatic capture in DirectX 11.1 and earlier mais tarde neste passo a passo.

Esta seção mostra como fazer estas tarefas:

  • Preparando o aplicativo para usar a captura programática

  • Obtendo a interface IDXGraphicsAnalysis

  • Capturando informações de gráficos

Dica

As implementações anteriores da captura programática dependiam das Ferramentas Remotas de Visual Studio para oferecer funcionalidade de captura, mas o DirectX 11.2 oferece suporte direto à captura.Dessa forma, você não precisa mais instalar as Ferramentas Remotas para a captura programática em aplicativos que usam a API do DirectX 11.2.

Preparando o aplicativo para usar a captura programática

O preparo do aplicativo Direct3D 11.2 para usar a captura programática é um processo em duas etapas. Primeiro, não se esqueça de incluir os arquivos de cabeçalho de que a captura programática precisa e definir a interface IDXGraphicsAnalysis no código-fonte do aplicativo.

Para incluir cabeçalhos de captura programática

  • Inclua estes cabeçalhos no arquivo de origem em que a interface IDXGraphicsAnalysis será definida:

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

    Importante

    Não inclua o arquivo de cabeçalho vsgcapture.h, que dá suporte à captura programática no DirectX 11.1 e anteriores, para realizar a captura programática nos aplicativos DirectX 11.2.Esse cabeçalho não é compatível com o DirectX 11.2.Se esse arquivo for incluído depois que o cabeçalho d3d11_2 for incluído, o compilador emitirá um aviso.Se vsgcapture.h for incluído antes de d3d11_2, o aplicativo não será iniciado.

    Dica

    Se o SDK do DirectX de junho de 2010 estiver instalado no computador e o caminho de inclusão do projeto contiver %DXSDK_DIR%include\x86, mova-o para o final do caminho de inclusão.Faça o mesmo com o caminho da biblioteca.

Para definir a interface IDXGraphicsAnalysis

  • Defina a interface IDXGraphicsAnalysis no mesmo arquivo em que você incluiu os arquivos de cabeçalho.

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

Por uma questão de comodidade, é possível realizar essas etapas em um novo arquivo de cabeçalho, em seguida, incluí-lo onde for necessário no aplicativo.

Obtendo a interface IDXGraphicsAnalysis

Antes de capturar informações gráficas do DirectX 11.2, você precisa criar uma interface com a interface de depuração DXGI.

Para obter a interface IDXGraphicsAnalysis

  • Use o código a seguir para ligar a interface IDXGraphicsAnalysis à interface de depuração DXGI.

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

    Não se esqueça de verificar o HRESULT retornado por DXGIGetDebugInterface1 para garantir que você obtenha uma interface válida antes de usá-la:

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

    Dica

    Se o aplicativo não estiver em execução no diagnóstico de gráficos (Alt+F5 no Visual Studio), DXGIGetDebugInterface1 retornará um erro: E_NOINTERFACE Essa interface não tem suporte.

Capturando informações de gráficos

Agora que você tem uma interface IDXGraphicsAnalysis válida, é possível usar BeginCapture e EndCapture para capturar informações gráficas.

Para capturar informações gráficas

  • Para iniciar a captura de informações gráficas, use BeginCapture:

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

    A captura começa assim que BeginCapture é chamado e não aguarda o início do próximo quadro. A captura para quando o quadro atual é apresentado ou quando você chama EndCapture:

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

Captura programática no DirectX 11.1 e anterior

Esta parte do passo a passo demonstra a captura programática em aplicativos que usam a API do DirectX 11.1, que usa o método de captura herdado. Para obter informações sobre como usar a captura programática em aplicativos que usam o DirectX 11.2, consulte Programmatic capture in DirectX 11.2 antes neste passo a passo.

Esta parte mostra estas tarefas:

  • Preparando o computador para usar a captura programática

  • Preparando o aplicativo para usar a captura programática

  • Configurando o nome e o local do arquivo de log dos gráficos

  • Usando a API do CaptureCurrentFrame

Preparando o computador para usar a captura programática

A API de captura programática usa as Ferramentas Remotas para Visual Studio para fornecer funcionalidade de captura. O computador em que o aplicativo será executado deve ter as ferramentas remotas instaladas, mesmo quando você esteja usando a captura programática no computador local. Visual Studio não precisa estar em execução quando você realiza a captura programática em um computador local.

Para usar as APIs de captura remota em um aplicativo que esteja em execução em um computador, primeiro, você precisa instalar as Ferramentas Remotas para Visual Studio nesse computador. Diferentes versões das ferramentas remotas dão suporte a diferentes plataformas de hardware. Para obter informações sobre como instalar as ferramentas remotas, consulte a página de download das Ferramentas Remotas no site de downloads da Microsoft.

Como alternativa, o Visual Studio instala os componentes necessários para a realização de captura remota de aplicativos de 32 bits.

Dica

Como a maioria dos aplicativos da área de trabalho do Windows, inclusive o Visual Studio, não é compatível no Windows 8 para dispositivos ARM, o uso das Ferramentas Remotas para Visual Studio com a API de captura programática é a única maneira de capturar diagnósticos de gráfico em dispositivos ARM.

Preparando o aplicativo para usar a captura programática

Para usar as ferramentas de diagnóstico de gráficos, primeiro, você precisa capturar as informações gráficas nas quais ele confia. É possível capturar de forma programática as informações usando a API do CaptureCurrentFrame.

Para preparar o aplicativo para capturar informações gráficas de forma programática

  1. Verifique se o cabeçalho vsgcapture.h está incluído no código-fonte do aplicativo. Ele pode estar incluído em apenas um local, por exemplo, no arquivo de código-fonte em que você chamará a API de captura programática, ou em um arquivo de cabeçalho pré-compilado para chamar a API de vários arquivos de código-fonte.

  2. No código-fonte do aplicativo, sempre que quiser capturar o restante do quadro atual, chame g_pVsgDbg->CaptureCurrentFrame(). Esse método não utiliza parâmetros e não retorna um valor.

Configurando o nome e o local do arquivo de log dos gráficos

O log de gráficos é criado no local definido pelas macros DONT_SAVE_VSGLOG_TO_TEMP e VSG_DEFAULT_RUN_FILENAME.

Para configurar o nome e o local do arquivo de log dos gráficos

  • Para evitar que o log de gráficos seja gravado no diretório temporário, antes da linha #include <vsgcapture.h>, adicione:

    #define DONT_SAVE_VSGLOG_TO_TEMP
    

    É possível definir esse valor para gravar o log de gráficos em um local relativo para o diretório de trabalho ou em um caminho absoluto, caso a definição de VSG_DEFAULT_RUN_FILENAME seja um caminho absoluto.

  • Para salvar o log de gráficos em um local diferente ou dar a ele um nome de arquivo diferente, antes da linha #include <vsgcapture.h>, adicione:

    #define VSG_DEFAULT_RUN_FILENAME <filename>
    

    Se você não realizar essa etapa, o nome do arquivo será default.vsglog. Se você não definiu DONT_SAVE_VSGLOG_TO_TEMP, o local do arquivo será relativo para o diretório temporário. Do contrário, ele será relativo para o diretório de trabalho ou em outro local, caso tenha sido especificado um nome de arquivo absoluto.

No caso de aplicativos do Windows Store, o local do diretório temporário é específico de cada usuário e aplicativo, e ele costuma estar em um local como C:\usuários\nome de usuário\AppData\Local\Pacotes\nome da família de pacotes\TempState\. No caso de aplicativos da área de trabalho, o local do diretório temporário é específico de cada usuário e costuma estar em um local como C:\Usuários\nome de usuário\AppData\Local\Temp\.

Dica

Para gravar em um local específico, você deve ter permissões para gravar nesse local, ou ocorrerá um erro.Lembre-se de que os aplicativos do Windows Store são mais restritos do que os aplicativos da área de trabalho em relação ao local onde podem gravar dados e podem exigir configuração adicional para gravação em determinados locais.

Capturando as informações gráficas

Depois que você tiver preparado o aplicativo para captura programática e, como opção, configurado o local e o nome do arquivo de log de gráficos, compile o aplicativo, em seguida, execute ou o depure para capturar dados. Não inicie o diagnóstico de gráficos no Visual Studio quando você usar a API de captura programática. O log de gráficos é gravado no local especificado por você. Se quiser manter essa versão do log, mova-a para outro local. Do contrário, ela será substituída quando o aplicativo for executado novamente.

Dica

Ainda assim é possível capturar informações gráficas manualmente enquanto você estiver usando a captura programática. Com o aplicativo no foco, basta pressionar Print Screen.Você pode usar essa técnica para capturar informações gráficas adicionais não capturadas pela API de captura programática.

Próximas etapas

Este passo a passo demonstrou como capturar informações gráficas de forma programática. Como próxima etapa, considere esta opção:

Consulte também

Tarefas

Passo a passo: capturando informações de gráficos

Conceitos

Capturando informações de gráficos