Implantação do Direct3D 11 para desenvolvedores de jogos

Este artigo descreve como implantar os componentes do Direct3D 11 em um sistema, se necessário.

Visão geral

A API Direct3D 11 estende a API Direct3D 10.1 existente com suporte para renderização multithread e criação de recursos, Compute Shader, tesselação por hardware, compactação de textura BC6H/BC7 e HLSL Shader Model 5.0 com Ligação Dinâmica de Sombradores. Além do componente Direct3D 11, vários componentes gráficos adicionais são incluídos no runtime do DirectX 11: Direct3D 11, DXGI 1.1, níveis de recurso 10level9, dispositivo de renderização de software WARP10, Direct2D, DirectWrite e um Direct3D 10.1 atualizado com suporte para níveis de recurso 10level9 e WARP10. Para obter informações sobre esses e outros componentes gráficos Windows, consulte Graphics APIs no Windows.

Todos esses novos componentes gráficos são integrados aos sistemas operacionais Windows 7 e Windows Server 2008 R2. A API do Direct3D 11 e os componentes relacionados também podem ser instalados no Windows Vista usando uma atualização do sistema de Windows Update. Essa atualização requer Windows Vista e Service Pack 2. Os usuários finais com atualizações automáticas habilitadas, portanto, provavelmente já terão os componentes do Direct3D 11 instalados, assim como todos os usuários Windows 7.

O exemplo D3D11InstallHelper foi projetado para simplificar a detecção da API do Direct3D 11, instalar automaticamente a atualização do sistema, se aplicável ao computador de um usuário final, e fornecer mensagens apropriadas ao usuário final no procedimento manual se um Service Pack mais recente for necessário.

Nota

O compilador HLSL (D3DCompile*.dll) e a biblioteca de utilitários D3DX para Direct3D 11 (D3DX11*.dll) não são integrados a nenhuma versão do sistema operacional Windows, mas eles podem ser implantados como parte do instalador de um aplicativo usando a tecnologia DirectSetup existente; para obter mais informações sobre como usar o DirectSetup, consulte DirectX Installation for Game Developers. "Efeitos 11" está disponível como uma biblioteca de suporte de origem compartilhada em Efects for Direct3D 11 Update e você pode incluí-la diretamente em um aplicativo (assim como a biblioteca do utilitário DXUT). Portanto, ele não tem requisitos adicionais de redistribuição em tempo de execução.

Direct3D 11.3

Windows 10 é fornecido com a API Direct3D 11.3 interna. Consulte Recursos do Direct3D 11.3 para obter uma lista de novos recursos na API do Direct3D 11.3.

Direct3D 11.2

Windows 8.1 e Windows Server 2012 R2 vêm com a API Direct3D 11.2 embutida. Consulte Recursos do Direct3D 11.2 para obter uma lista de novos recursos na API do Direct3D 11.2.

Direct3D 11.1

Windows 8 e Windows Server 2012 incluem a API Direct3D 11.1. O suporte parcial para a API do Direct3D 11.1 está disponível no Windows 7 ou Windows Server 2008 R2 com a atualização Platform para Windows 7 instalada. Para obter mais informações sobre a Atualização da Plataforma para Windows 7, consulte Platform Update for Windows 7.

D3D11InstallHelper.dll

D3D11InstallHelper.dll hospeda a funcionalidade principal para detectar componentes do Direct3D 11 e executar a atualização do sistema por meio do serviço Windows Update, se aplicável. A DLL não exibe mensagens ou caixas de diálogo diretamente.

A DLL consiste nos seguintes pontos de entrada:

CheckDirect3D11Status

Essa função executa as verificações necessárias e retorna o status do Direct3D 11 neste computador. Essa função não exige direitos de administrador.

  • Um status de D3D11IH_STATUS_INSTALLED indica que o Direct3D 11 já está instalado no computador e está pronto para uso.
  • D3D11IH_STATUS_NOT_SUPPORTED indica que essa versão do Windows não dá suporte ao Direct3D 11 nem a tecnologias relacionadas.
  • Um status de D3D11IH_STATUS_NEED_LATEST_SP indica que o Service Pack Windows Vista mais recente deve ser instalado pelo usuário.
  • Por fim, um status de D3D11IH_STATUS_REQUIRES_UPDATE indica que o sistema não tem o Direct3D 11 instalado, mas que a atualização do sistema se aplica a essa versão do Windows.

DoUpdateForDirect3D11

Essa função usa a API Windows Update para executar a atualização do sistema para instalar o Direct3D 11 nesse sistema, se aplicável. Observe que essa função requer conectividade de rede para Windows Update ter êxito, bem como direitos administrativos. Ele aceita uma função de retorno de chamada de progresso opcional e um ponteiro de contexto do usuário, e retorna um código de resultado final quando concluído.

  • O resultado do D3D11IH_RESULT_SUCCESS indica que a atualização do sistema foi aplicada e está pronta para uso, enquanto D3D11IH_RESULT_SUCCESS_REBOOT indica que a atualização do sistema exige que o computador seja reiniciado antes de ser concluído. Observe que essa função não agenda uma reinicialização do sistema.
  • D3D11IH_RESULT_NOT_SUPPORTED indica que a atualização do sistema não é compatível com esta versão do Windows. Esse resultado não deve ocorrer se essa função for chamada somente depois de obter um status de D3D11IH_STATUS_REQUIRES_UPDATE de CheckDirect3D11Status.
  • Um resultado de D3D11IH_RESULT_UPDATE_NOT_FOUND indica que o pacote de atualização do sistema não foi encontrado nos servidores Windows Update.
  • Se o download ou a instalação do Windows Update falhar, D3D11IH_RESULT_UPDATE_DOWNLOAD_FAILED ou D3D11IH_RESULT_UPDATE_INSTALL_FAILED serão retornados.
  • Se um erro de conectividade de rede for retornado da API Windows Update, o resultado do D3D11IH_RESULT_WU_SERVICE_ERROR será retornado, indicando que o problema pode ser intermitente ou relacionado às configurações de rede ou de firewall. Tentar a função de atualização novamente pode ter êxito.

Para obter mais informações sobre a API Windows Update, consulte Windows Update Agent API.

D3D11Install.exe

Nota

D3D11Install.exe requer D3D11InstallHelper.dll para executar.

D3D11Install.exe é uma ferramenta para usar D3D11InstallHelper.dll como um instalador autônomo completo com mensagens de usuário final e interface do usuário, além de atuar como um exemplo para o uso adequado da DLL. O processo será encerrado com um 0 se o Direct3D 11 já estiver instalado, se a atualização do sistema for aplicada com êxito sem a necessidade de uma reinicialização do sistema, se uma instalação do Service Pack for necessária ou se o Direct3D 11 não tiver suporte neste computador. Um 1 será retornado se a atualização do sistema for aplicada com êxito e exigir uma reinicialização do sistema para ser concluída. O valor 2 é retornado para outras condições de erro. Observe que esse arquivo executável requer direitos de administrador para ser executado e tem um manifesto que solicita elevação quando executado em Windows Vista ou Windows 7 com o UAC habilitado. D3D11Install.exe pode ser usado como uma ferramenta autônoma para implantar a atualização do Direct3D 11 ou pode ser usada diretamente pelos instaladores.

Ele dá suporte aos seguintes comutadores de linha de comando:

/Tranquila

Não exibe mensagens, prompts, caixas de diálogo de progresso ou mensagens de erro.

/passiva

Não exibe mensagens, prompts ou mensagens de erro, mas mostrará a caixa de diálogo de progresso.

/mínimo

Mostra apenas prompts mínimos.

/Y

Suprime a solicitação para confirmar a instalação da atualização, se necessário e aplicável, para uma instalação padrão e mínima.

/langid decimal

Força o código do identificador de idioma a ser usado ao exibir as mensagens do usuário final e os recursos da caixa de diálogo. O valor padrão é 1024, que usa a configuração de idioma padrão do sistema.

/Wu

Força o uso do Windows Update em vez do padrão do sistema, que pode ser o Windows Server Update Services (WSUS) em execução em um servidor gerenciado ou outra configuração não padrão.

Integração em programas de instalação

Para estar em conformidade com o Suporte à Instalação Fácil, o Requisito técnico 3.1 para jogos para Windows, é necessário tomar cuidado para que quaisquer prompts de usuário final sejam apresentados no início do processo de instalação e garantir que não haja várias solicitações de elevação relacionadas ao UAC. Há três opções básicas para atingir essa meta:

  1. O método mais básico é executar o D3D11Install.exe com o comutador de linha de comando /mínimo. Isso deve ser feito no início da sessão de perguntas e respostas do instalador, e a instalação deve utilizar o valor de retorno de 1 para indicar que uma reinicialização deve ser agendada no final da instalação. A execução do programa requer direitos administrativos.
  2. Utilize o D3D11InstallHelper.dll diretamente para detectar a necessidade da atualização, fornecendo as mensagens necessárias do usuário final para o status D3D11IH_STATUS_NEED_LATEST_SP, caso a resolução necessite de operações manuais do usuário. O resultado do status de D3D11IH_STATUS_NOT_SUPPORTED pode ser usado para controlar a instalação de ativos relacionados ao Direct3D 11 ou como uma condição de erro para aplicativos somente Direct3D 11, mas não é necessariamente uma mensagem útil para o usuário final. Para o status D3D11IH_STATUS_REQUIRES_UPDATE, o instalador pode usar diretamente o ponto de entrada DLL DoUpdateForDirect3D11 para executar a atualização e manipular as várias mensagens de usuário final resultantes. Exemplos de mensagens padrão podem ser encontrados examinando a caixa de diálogo D3D11Install.exe e os recursos da tabela de cadeia de caracteres. O ponto de entrada de atualização requer direitos de administrador.
  3. Uma abordagem híbrida é verificar o status com D3D11InstallHelper.dll, e, no caso do código de status D3D11IH_STATUS_NEED_LATEST_SP ou D3D11IH_STATUS_REQUIRES_UPDATE, o D3D11Install.exe pode ser executado com as opções /minimal e /y para exibir a caixa de diálogo ou realizar a atualização, conforme necessário. Essas etapas devem ser executadas no início do processo de instalação, geralmente imediatamente após o Q&A, e executar o executável requer direitos administrativos.

Integração ao InstallShield

O gerenciamento da implementação do Direct3D 11 no InstallScript do InstallShield é facilmente realizado usando o exemplo D3D11InstallHelper. As etapas necessárias para integrar ao InstallShield usando InstallScript são as seguintes (usando o método 3, descrito na seção anterior):

  1. Abra um projeto InstallScript no editor InstallShield.

  2. Adicione D3D11InstallHelper.dll e D3D11Install.exe ao projeto em arquivos de suporte .

    Para adicionar os arquivos ao Projeto do InstallShield

    1. Na guia Designer de Instalação, clique em Arquivos de Suporte/Banners em Comportamento e Lógica no painel de navegação à esquerda.
    2. Clique em Independente de Linguagem, então clique com o botão direito do mouse na janela Arquivos e selecione Inserir Arquivos. Navegue para adicionar D3D11InstallHelper.dll e D3D11Install.exe. O local padrão para esses arquivos é: Raiz do SDK\Samples\C++\Misc\Bin\x86
  3. No Gerenciador do InstallScript, clique no arquivo InstallScript (geralmente Setup.rul) que chamará a DLL ou executável, localizada em Comportamento e Lógica no painel de navegação à esquerda.

  4. Cole o seguinte InstallScript no arquivo próximo ao topo:

#define D3D11IH_STATUS_INSTALLED 0 #define D3D11IH_STATUS_NOT_SUPPORTED 1 #define D3D11IH_STATUS_REQUIRES_UPDATE 2 #define D3D11IH_STATUS_NEED_LATEST_SP 3 #define D3D11IH_STATUS_ERROR -1 protótipo NUMBER D3D11InstallHelper.CheckDirect3D11StatusIS();

#define D3D11IH_RESULT_SUCCESS 0 #define D3D11IH_RESULT_SUCCESS_REBOOT 1 #define D3D11IH_RESULT_NOT_SUPPORTED 2 #define D3D11IH_RESULT_UPDATE_NOT_FOUND 3 #define D3D11IH_RESULT_UPDATE_DOWNLOAD_FAILED 4 #define D3D11IH_RESULT_UPDATE_INSTALL_FAILED 5 #define D3D11IH_RESULT_WU_SERVICE_ERROR 6 #define D3D11IH_RESULT_ERROR -1 protótipo NUMBER D3D11InstallHelper.DoUpdateForDirect3D11IS(BOOL); ```

  1. Cole o seguinte script de instalação no arquivo na função OnFirstUIBefore, pouco antes do comando return 0:

    Dlg_D3D11:
        UseDLL( SUPPORTDIR ^ "D3D11InstallHelper.DLL" );
        nResult = D3D11InstallHelper.CheckDirect3D11StatusIS();   
        UnUseDLL( SUPPORTDIR ^ "D3D11InstallHelper.DLL" );
    
        if ( nResult = D3D11IH_STATUS_REQUIRES_UPDATE
             || nResult = D3D11IH_STATUS_NEED_LATEST_SP) then
            nResult = LaunchAppAndWait(
    SUPPORTDIR^"D3D11Install.exe",
    "/minimal /y", WAIT);
            if ( nResult < 0 ) then
                MessageBox("Unable to launch D3D11Install.exe",
     SEVERE);
            elseif ( nResult == 1 ) then
                BATCH_INSTALL = 1;
            endif;          
        endif;
    

Integração em um pacote MSI

Veja a seguir uma descrição de alto nível das etapas necessárias para integrar a implantação do Direct3D 11 usando ações personalizadas de MSI (usando o método 3, descrito anteriormente neste tópico):

  1. Adicione uma propriedade à tabela de propriedades MSI chamada RelativePathToD3D11IH que contém o caminho relativo para D3D11Install.exe e D3D11InstallHelper.dll durante a instalação (isso normalmente está na imagem de mídia). Isso também define uma propriedade MSI D3D11IH_STATUS para o status retornado por CheckDirect3D11Status (uma propriedade de cadeia de caracteres igual ao símbolo de enumeração ou "ERROR").
  2. Após a ação CostFinalize, chame a função D3D11InstallHelper.dll SetD3D11InstallMSIProperties como uma ação personalizada imediata para definir as propriedades msi apropriadas para as outras ações personalizadas.
  3. Após a instalação, dispare uma ação personalizada adiada após a ação InstallFiles que chama a função D3D11InstallHelper.dll DoD3D11InstallUsingMSI. A ação personalizada deve definir o sinalizador msidbCustomActionTypeNoImpersonate para ser executado em um contexto elevado.
  4. Após a ação InstallFinalize, chame a função D3D11InstallHelper.dll FinishD3D11InstallUsingMSI como uma ação personalizada imediata para lidar com o código de resultado da solicitação de reinicialização bem-sucedida, se necessário.

Este procedimento é descrito em detalhes nas instruções a seguir, que descrevem um processo que pode ser feito usando um editor msi, como o editor Orca. Alguns editores msi têm assistentes que simplificam algumas dessas etapas de configuração.

Para configurar um pacote MSI para integração com D3D11InstallHelper.dll

  1. Abra o pacote MSI em Orca.

  2. Adicione a linha mostrada na tabela a seguir à tabela Binária no pacote MSI.

    Nome Dados
    D3D11IH Caminho do arquivo da DLL\D3D11InstallHelper.dll

     

    Nota

    Esse arquivo será inserido no pacote MSI, portanto, você deve executar essa etapa sempre que recompilar D3D11InstallHelper.dll.

     

  3. Adicione as linhas mostradas na tabela a seguir à tabela CustomAction no pacote MSI.

    Ação Tipo Fonte Alvo
    Direct3D11SetProps msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH SetD3D11InstallMSIProperties
    Direct3D11DoInstall msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 D3D11IH DoD3D11InstallUsingMSI
    Direct3D11Finish msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH FinishD3D11InstallUsingMSI

     

  4. Adicione os valores mostrados para Ação, Condição e Sequência na tabela a seguir à tabela InstallExecuteSequence no pacote MSI.

    Ação Condição Sequência Anotações
    Direct3D11SetProps 1016 O número de sequência coloca a ação logo após CostFinalize.
    Direct3D11DoInstall NÃO Instalado 4004 Essa ação personalizada só acontecerá durante uma nova instalação para todos os usuários. O número de sequência coloca a ação após InstallFiles e após as reversões.
    Direct3D11Finish 6615 O número de sequência coloca a ação logo após InstallFinalize.

     

  5. Adicione a linha mostrada na tabela a seguir à tabela Property no pacote MSI.

    Propriedade Valor
    RelativePathToD3D11IH caminho de arquivo relativo que contém D3D11Install.exe e D3D11InstallHelper.dll

     

    Nota

    O local especificado pelo caminho é relativo ao local especificado pelo caminho de instalação, por exemplo, "redist\".

     

  6. Salve o pacote MSI. Para obter informações mais detalhadas sobre pacotes MSI e Windows Installer, consulte Windows Installer.

Dicas de depuração

Tanto D3D11InstallHelper.dll quanto D3D11Install.exe podem ser criados com a configuração de depuração em Visual Studio e essas versões imprimirão mensagens no mecanismo de saída de depuração padrão Windows.

Configurações corporativas

O exemplo D3D11InstallHelper foi projetado para implantação padrão por meio de Windows Update, que é o cenário mais comum para a instalação de um jogo por consumidores. No entanto, muitos desenvolvedores de jogos, trabalhando para editores e em estúdios de desenvolvimento, fazem isso em configurações empresariais que têm um servidor gerenciado localmente fornecendo atualizações de software usando a tecnologia WSUS (Serviços de Atualização Windows Server). Nesse tipo de ambiente, o administrador de TI local tem controle de aprovação sobre quais atualizações são disponibilizadas para computadores na rede corporativa e a versão padrão do consumidor da atualização KB 971644 não está disponível.

Há três soluções básicas para implantar o DirectX 11 em configurações corporativas/empresariais:

  • Em algumas configurações, é possível verificar diretamente Windows Update em vez de usar o servidor WSUS gerenciado localmente. Por esse motivo, D3D11InstallHelper dá suporte à opção de linha de comando /wu. No entanto, nem todas as redes corporativas permitem conexões com os servidores Microsoft públicos.
  • O administrador de TI local pode aprovar o KB 971512, uma atualização com suporte empresarial implantada do WSUS, que inclui a API do Direct3D 11. Essa é a única opção para um Usuário Standard obter a atualização do Direct3D 11 em um ambiente totalmente bloqueado.
  • Como alternativa, o KB 971512 pode ser instalado manualmente.

É muito raro que o computador de um jogador só possa obter atualizações de um servidor WSUS gerenciado localmente, e são apenas desenvolvedores em grandes organizações que provavelmente estarão nesses ambientes.

Windows Firewall para Desenvolvedores de Jogos

Windows Gerenciador de Jogos para Desenvolvedores de Jogos