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 do Direct3D 11 estende a API existente do Direct3D 10.1 com suporte para renderização multithread e criação de recursos, Sombreador de Computação, mosaico de hardware, compactação de textura BC6H/BC7 e Modelo de Sombreador HLSL 5.0 com Vinculação de Sombreador Dinâmico. 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, 10level9, dispositivo de renderização de software WARP10, Direct2D, DirectWrite e um Direct3D 10.1 atualizado com suporte para 10level9 e WARP10. Para obter informações sobre esses e outros componentes gráficos do Windows, consulte APIs gráficas 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 do Windows Update. Essa atualização requer o Windows Vista e o 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 do 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.

Observação

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 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 Instalação do DirectX para desenvolvedores de jogos. "Efeitos 11" está disponível como uma biblioteca de suporte de origem compartilhada em Efeitos para a Atualização do Direct3D 11 e você pode incluí-la diretamente em um aplicativo (assim como a biblioteca de utilitários DXUT). Portanto, ele não tem nenhum requisito adicional de redistribuição em tempo de execução.

Direct3D 11.3

Windows 10 é fornecido com a API do 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 com a API direct3D 11.2 interna. 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 com a API do Direct3D 11.1 interna. O suporte parcial para a API do Direct3D 11.1 está disponível no Windows 7 ou no Windows Server 2008 R2 com a Atualização de Plataforma para Windows 7 instalada. Para obter mais informações sobre a Atualização de Plataforma para Windows 7, consulte Platform Update para 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 requer 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 esta 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 mais recente do Windows Vista 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 usa 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 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 se aplica a esta versão do Windows. Esse resultado não deve ocorrer se essa função for chamada somente depois de obter um D3D11IH_STATUS_REQUIRES_UPDATE status 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 Windows Update baixar ou a instalação falhar, D3D11IH_RESULT_UPDATE_DOWNLOAD_FAILED ou D3D11IH_RESULT_UPDATE_INSTALL_FAILED será retornado como resultado.
  • Se um erro de conectividade de rede for retornado da API Windows Update, o resultado D3D11IH_RESULT_WU_SERVICE_ERROR será retornado, indicando que o problema pode ser intermitente ou relacionado à configuração de rede ou às configurações de firewall. Tentar a função de atualização novamente pode ter êxito.

Para obter mais informações sobre a API Windows Update, consulte API do agente de Windows Update.

D3D11Install.exe

Observação

D3D11Install.exe requer D3D11InstallHelper.dll para execução.

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 a conclusão de uma reinicialização do sistema. Um 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 no Windows Vista ou no 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 às seguintes opções 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 mensagens do usuário final e 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 de Windows Update em vez do padrão do sistema, que pode ser Windows Server Update Services (WSUS) em execução em um servidor gerenciado ou em alguma 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, Requisito Técnico 3.1 para Jogos para Windows, é necessário tomar cuidado para que quaisquer prompts do usuário final sejam apresentados no início do processo de instalação e para garantir que não haja vários prompts de elevação relacionados 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 a opção de linha de comando /minimal. Isso deve ser feito no início do Q&A do instalador e a instalação deve usar o valor retornado 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. Use D3D11InstallHelper.dll diretamente para detectar a necessidade da atualização, fornecendo todas as mensagens do usuário final necessárias para o status D3D11IH_STATUS_NEED_LATEST_SP, em que a resolução requer operações manuais do usuário. O resultado 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, de outra forma, não é necessariamente uma mensagem útil do 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 resultantes do usuário final. 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 é marcar status com D3D11InstallHelper.dll e, no caso do código status D3D11IH_STATUS_NEED_LATEST_SP ou D3D11IH_STATUS_REQUIRES_UPDATE, D3D11Install.exe pode ser executado com as opções /minimal e /y para exibir a caixa de diálogo ou para executar 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 a execução do executável requer direitos administrativos.

Integração ao InstallShield

Lidar com a implantação do Direct3D 11 do InstallScript do InstallShield é feito facilmente usando o exemplo D3D11InstallHelper. As etapas necessárias para integrar o 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 InstallShield

    1. Na guia Designer de Instalação, clique em Arquivos de Suporte/Outdoors em Comportamento e Lógica no painel de navegação à esquerda.
    2. Clique em Independente de Idioma e 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 explorador 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 à parte superior:

#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 InstallScript no arquivo na função OnFirstUIBefore , pouco antes do retorno 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 do MSI (usando o método 3, descrito anteriormente neste tópico):

  1. Adicione uma propriedade à tabela propriedade 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 à status retornada 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 Binary no pacote MSI.

    Nome Dados
    D3D11IH Caminho do arquivo para o DLL\D3D11InstallHelper.dll

     

    Observação

    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 Destino
    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 Action, Condition e Sequence na tabela a seguir à tabela InstallExecuteSequence no pacote MSI.

    Ação Condição Sequência Observações
    Direct3D11SetProps 1016 O número de sequência coloca a ação logo após CostFinalize.
    Direct3D11DoInstall NOT Installed 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 da sequência coloca a ação logo após InstallFinalize.

     

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

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

     

    Observação

    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 criadas com a configuração de Depuração no Visual Studio, e essas versões imprimirão mensagens no mecanismo de saída de depuração padrão do 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 corporativas que têm um servidor gerenciado localmente fornecendo atualizações de software usando a tecnologia Windows Server Update Services (WSUS). Nesse tipo de ambiente, o administrador de TI local tem controle de aprovação sobre quais atualizações são disponibilizadas para computadores dentro da 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/corporativas:

  • Em algumas configurações, é possível marcar Windows Update diretamente 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 públicos da Microsoft.
  • 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, os 971512 de KB podem ser instalados manualmente.

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

Firewall do Windows para Desenvolvedores de Jogos

Windows Games Explorer para Desenvolvedores de Jogos