Compartilhar via


Empacotar seu jogo DirectX da Plataforma Universal do Windows (UWP)

Jogos maiores da Plataforma Universal do Windows (UWP), especialmente aqueles que dão suporte a vários idiomas com ativos específicos da região ou apresentam ativos opcionais de alta definição, podem facilmente aumentar para tamanhos grandes. Neste tópico, saiba como usar pacotes de aplicativos e pacotes de aplicativos para personalizar seu aplicativo para que seus clientes recebam apenas os recursos de que realmente precisam.

Além do modelo de pacote de aplicativos, o Windows 10 dá suporte a pacotes de aplicativos que agrupam dois tipos de pacotes:

  • Os pacotes de aplicativos contêm executáveis e bibliotecas específicos da plataforma. Normalmente, um jogo UWP pode ter até três pacotes de aplicativos: um para as arquiteturas de CPU x86, x64 e Arm. Todo o código e dados específicos dessa plataforma de hardware devem ser incluídos em seu pacote de aplicativos. Um pacote de aplicativos também deve conter todos os ativos principais para que o jogo seja executado com um nível básico de fidelidade e desempenho.
  • Os pacotes de recursos contêm dados opcionais ou expandidos independentes de plataforma, como ativos de jogo (texturas, malhas, som, texto). Um jogo UWP pode ter um ou mais pacotes de recursos, incluindo pacotes de recursos para ativos ou texturas de alta definição, recursos de nível de recurso 11+ do DirectX ou ativos e recursos específicos do idioma.

Para obter mais informações sobre pacotes de aplicativos e pacotes de aplicativos, leia Definindo recursos do aplicativo.

Embora você possa colocar todo o conteúdo em seus pacotes de aplicativos, isso é ineficiente e redundante. Por que o mesmo arquivo de textura grande foi replicado três vezes para cada plataforma, especialmente para plataformas Arm que podem não usá-lo? Um bom objetivo é tentar minimizar o que seu cliente precisa baixar, para que ele possa começar a jogar mais cedo, economizar espaço no dispositivo e evitar possíveis custos de largura de banda limitados.

Para usar esse recurso do instalador de aplicativo UWP, é importante considerar o layout de diretório e as convenções de nomenclatura de arquivo para empacotamento de aplicativos e recursos no início do desenvolvimento do jogo, para que suas ferramentas e fonte possam gerá-los corretamente de uma maneira que simplifique o empacotamento. Siga as regras descritas neste documento ao desenvolver ou configurar a criação de ativos e gerenciar ferramentas e scripts e ao criar código que carrega ou faz referência a recursos.

Por que criar pacotes de recursos?

Quando você cria um aplicativo, especialmente um aplicativo de jogo que pode ser vendido em várias localidades ou em uma ampla variedade de plataformas de hardware UWP, geralmente é necessário incluir várias versões de muitos arquivos para dar suporte a essas localidades ou plataformas. Por exemplo, se você estiver lançando seu jogo nos Estados Unidos e no Japão, talvez precise de um conjunto de arquivos de voz em inglês para as localidades en-us e outro em japonês para a localidade jp-jp. Ou, se você quiser usar uma imagem em seu jogo para dispositivos Arm, bem como plataformas x86 e x64, deverá carregar o mesmo ativo de imagem 3 vezes, uma vez para cada arquitetura de CPU.

Além disso, se o jogo tiver muitos recursos de alta definição que não se aplicam a plataformas com níveis de recursos mais baixos do DirectX, por que incluí-los no pacote de aplicativos de linha de base e exigir que o usuário baixe um grande volume de componentes que o dispositivo não pode usar? Separar esses recursos de alta definição em um pacote de recursos opcional significa que os clientes com dispositivos que suportam esses recursos de alta definição podem obtê-los ao custo de largura de banda (possivelmente limitada), enquanto aqueles que não têm dispositivos de última geração podem obter seu jogo mais rapidamente e com um custo de uso de rede menor.

Os candidatos a conteúdo para pacotes de recursos de jogos incluem:

  • Ativos específicos da localidade internacional (texto, áudio ou imagens localizados)
  • Ativos de alta resolução para diferentes fatores de dimensionamento de dispositivos (1,0x, 1,4x e 1,8x)
  • Ativos de alta definição para níveis mais altos de recursos do DirectX (9, 10 e 11)

Tudo isso é definido no package.appxmanifest que faz parte do seu projeto UWP e na estrutura de diretórios do pacote final. Devido à nova interface do usuário do Visual Studio, se você seguir o processo neste documento, não precisará editá-lo manualmente.

Importante O carregamento e o gerenciamento desses recursos são tratados por meio das APIs Windows.ApplicationModel.Resources*. Se você usar essas APIs de recurso de modelo de aplicativo para carregar o arquivo correto para uma localidade, fator de dimensionamento ou nível de recurso do DirectX, não será necessário carregar seus ativos usando caminhos de arquivo explícitos; em vez disso, você fornece às APIs de recurso apenas o nome de arquivo generalizado do ativo desejado e permite que o sistema de gerenciamento de recursos obtenha a variante correta do recurso para a plataforma atual do usuário e a configuração de localidade (que você também pode especificar diretamente com essas mesmas APIs).

Os recursos para empacotamento de recursos são especificados de duas maneiras básicas:

  • Os arquivos de ativo têm o mesmo nome de arquivo e as versões específicas do pacote de recursos são colocadas em diretórios nomeados específicos. Esses nomes de diretório são reservados pelo sistema. Por exemplo, \en-us, \scale-140, \dxfl-dx11.
  • Os arquivos de ativos são armazenados em pastas com nomes arbitrários, mas os arquivos são nomeados com um rótulo comum que é anexado com cadeias de caracteres reservadas pelo sistema para denotar o idioma ou outros qualificadores. Especificamente, as cadeias de caracteres de qualificação são afixadas ao nome de arquivo generalizado após um sublinhado ("_"). Por exemplo, \assets\menu_option1_lang-en-us.png, \assets\menu_option1_scale-140.png, \assets\coolsign_dxfl-dx11.dds. Você também pode combinar essas strings. Por exemplo, \assets\menu_option1_scale-140_lang-en-us.png.

    Observação Quando usado em um nome de arquivo em vez de sozinho em um nome de diretório, um qualificador de idioma deve assumir o formato "lang-tag<>", por exemplo, "lang-en-us", conforme descrito em Personalizar seus recursos para idioma, escala e outros qualificadores.

Os nomes de diretório podem ser combinados para especificidade adicional no empacotamento de recursos. No entanto, eles não podem ser redundantes. Por exemplo, \en-us\menu_option1_lang-en-us.png é redundante.

Você pode especificar quaisquer nomes de subdiretório não reservados necessários em um diretório de recursos, desde que a estrutura de diretórios seja idêntica em cada diretório de recursos. Por exemplo, \dxfl-dx10\assets\textures\coolsign.dds. Quando você carrega ou faz referência a um ativo, o nome do caminho deve ser generalizado, removendo todos os qualificadores para idioma, escala ou nível de recurso do DirectX, estejam eles em nós de pasta ou nos nomes de arquivo. Por exemplo, para se referir no código a um ativo para o qual uma das variantes é \dxfl-dx10\assets\textures\coolsign.dds, use \assets\textures\coolsign.dds. Da mesma forma, para se referir a um ativo com uma variante \images\background_scale-140.png, use \images\background.png.

Aqui estão os seguintes nomes de diretório reservados e prefixos de sublinhado de nome de arquivo:

Tipo de ativo Nome do diretório do pacote de recursos Sufixo do nome do arquivo do pacote de recursos
Ativos localizados Todos os idiomas possíveis, ou combinações de idioma e localidade, para Windows 10. (O prefixo do qualificador "lang-" não é necessário em um nome de pasta.) Um "_" seguido pelo especificador de idioma, localidade ou localidade de idioma. Por exemplo, "_en", "_us" ou "_en-us", respectivamente.
Ativos de fator de dimensionamento escala-100, escala-140, escala-180. Eles são para os fatores de dimensionamento de interface do usuário de 1,0x, 1,4x e 1,8x, respectivamente. Um "_" seguido por "escala-100", "escala-140" ou "escala-180".
Ativos de nível de recurso do DirectX DXFL-DX9, DXFL-DX10 e DXFL-DX11. Eles são para os níveis de recursos do DirectX 9, 10 e 11, respectivamente. Um "_" seguido por "dxfl-dx9", "dxfl-dx10" ou "dxfl-dx11".

 

Definindo pacotes de recursos de idioma localizados

Arquivos específicos da localidade são colocados em diretórios de projeto nomeados para o idioma (por exemplo, "en").

Ao configurar seu aplicativo para oferecer suporte a ativos localizados para vários idiomas, você deve:

  • Crie um subdiretório de aplicativo (ou versão de arquivo) para cada idioma e localidade que você suportará (por exemplo, en-us, jp-jp, zh-cn, fr-fr e assim por diante).

  • Durante o desenvolvimento, coloque cópias de TODOS os ativos (como arquivos de áudio localizados, texturas e gráficos de menu) no subdiretório de localidade do idioma correspondente, mesmo que não sejam diferentes entre idiomas ou localidades. Para obter a melhor experiência do usuário, certifique-se de que o usuário seja alertado se não tiver obtido um pacote de recursos de idioma disponível para sua localidade, se houver um disponível (ou se o tiver excluído acidentalmente após o download e a instalação).

  • Certifique-se de que cada arquivo de recurso de ativo ou cadeia de caracteres (.resw) tenha o mesmo nome em cada diretório. Por exemplo, menu_option1.png deve ter o mesmo nome nos diretórios \en-us e \jp-jp, mesmo que o conteúdo do arquivo seja para um idioma diferente. Nesse caso, você os veria como \en-us\menu_option1.png e \jp-jp\menu_option1.png.

    Observação Opcionalmente, você pode acrescentar a localidade ao nome do arquivo e armazená-la no mesmo diretório; por exemplo, \assets\menu_option1_lang-en-us.png, \assets\menu_option1_lang-jp-jp.png.

     

  • Use as APIs em Windows.ApplicationModel.Resources e Windows.ApplicationModel.Resources.Core para especificar e carregar os recursos específicos da localidade para seu aplicativo. Além disso, use referências de ativos que não incluam a localidade específica, pois essas APIs determinam a localidade correta com base nas configurações do usuário e, em seguida, recuperam o recurso correto para o usuário.

  • No Microsoft Visual Studio 2015, selecione PROJECT-Store-Create>> App Package... e crie o pacote.

Definindo pacotes de recursos de fator de escala

Windows 10 fornece três fatores de dimensionamento da interface do usuário: 1,0x, 1,4x e 1,8x. Os valores de dimensionamento para cada monitor são definidos durante a instalação com base em vários fatores combinados: o tamanho da tela, a resolução da tela e a distância média presumida do usuário em relação à tela. O usuário também pode ajustar os fatores de escala para melhorar a legibilidade. Seu jogo deve ter reconhecimento de DPI e fator de dimensionamento para a melhor experiência possível. Parte dessa consciência significa criar versões de ativos visuais críticos para cada um dos três fatores de dimensionamento. Isso também inclui interação de ponteiro e teste de clique!

Ao configurar seu aplicativo para dar suporte a pacotes de recursos para diferentes fatores de dimensionamento de aplicativos UWP, você deve:

  • Crie um subdiretório de aplicativo (ou versão de arquivo) para cada fator de dimensionamento que você suportará (escala-100, escala-140 e escala-180).

  • Durante o desenvolvimento, coloque cópias apropriadas do fator de escala de TODOS os ativos em cada diretório de recursos do fator de escala, mesmo que não sejam diferentes entre os fatores de escala.

  • Certifique-se de que cada ativo tenha o mesmo nome em cada diretório. Por exemplo, menu_option1.png deve ter o mesmo nome nos diretórios \scale-100 e \scale-180, mesmo que o conteúdo do arquivo seja diferente. Nesse caso, você os veria como \scale-100\menu_option1.png e \scale-140\menu_option1.png.

    Observação Novamente, você pode, opcionalmente, acrescentar o sufixo do fator de dimensionamento ao nome do arquivo e armazená-los no mesmo diretório; por exemplo, \assets\menu_option1_scale-100.png, \assets\menu_option1_scale-140.png.

     

  • Use as APIs em Windows.ApplicationModel.Resources.Core para carregar os ativos. As referências de ativos devem ser generalizadas (sem sufixo), deixando de fora a variação de escala específica. O sistema recuperará o ativo de escala apropriado para a exibição e as configurações do usuário.

  • No Visual Studio 2015, selecione PROJECT-Store-Create>> App Package... e crie o pacote.

Definindo pacotes de recursos de nível de recurso do DirectX

Os níveis de recursos do DirectX correspondem aos conjuntos de recursos da GPU para versões anteriores e atuais do DirectX (especificamente, Direct3D). Isso inclui especificações e funcionalidades do modelo de sombreador, suporte à linguagem do sombreador, suporte à compactação de textura e recursos gerais do pipeline de gráficos.

Seu pacote de aplicativos de linha de base deve usar os formatos de compactação de textura de linha de base: BC1, BC2 ou BC3. Esses formatos podem ser consumidos por qualquer dispositivo UWP, desde plataformas Arm de baixo custo até estações de trabalho dedicadas com várias GPUs e computadores de mídia.

O suporte ao formato de textura no nível de recurso 10 ou posterior do DirectX deve ser adicionado a um pacote de recursos para conservar o espaço em disco local e baixar a largura de banda. Isso permite usar os esquemas de compactação mais avançados para 11, como BC6H e BC7. (Para obter mais detalhes, consulte Compactação de bloco de textura no Direct3D 11.) Esses formatos são mais eficientes para os ativos de textura de alta resolução compatíveis com GPUs modernas, e usá-los melhora a aparência, o desempenho e os requisitos de espaço do seu jogo em plataformas de ponta.

Nível de recurso do DirectX Compactação de textura com suporte
9 BC1, BC2, BC3
10 BC4, BC5
11 BC6H, BC7

 

Além disso, cada nível de recurso do DirectX dá suporte a diferentes versões do modelo de sombreador. Os recursos de sombreador compilados podem ser criados por nível de recurso e podem ser incluídos em pacotes de recursos de nível de recurso do DirectX. Além disso, alguns modelos de sombreador de versão posterior podem usar ativos, como mapas normais, que as versões anteriores do modelo de sombreador não podem. Esses ativos específicos do modelo de sombreador também devem ser incluídos em um pacote de recursos de nível de recurso do DirectX.

O mecanismo de recursos é focado principalmente em formatos de textura compatíveis com ativos, portanto, ele oferece suporte apenas aos 3 níveis gerais de recursos. Se você precisar ter sombreadores separados para subníveis (versões de ponto), como DX9_1 versus DX9_3, o gerenciamento de ativos e o código de renderização deverão tratá-los explicitamente.

Ao configurar seu aplicativo para dar suporte a pacotes de recursos para diferentes níveis de recursos do DirectX, você deve:

  • Crie um subdiretório de aplicativo (ou versão de arquivo) para cada nível de recurso do DirectX ao qual você dará suporte (dxfl-dx9, dxfl-dx10 e dxfl-dx11).

  • Durante o desenvolvimento, coloque ativos específicos no nível do recurso em cada diretório de recursos no nível do recurso. Ao contrário das localidades e dos fatores de dimensionamento, você pode ter diferentes ramificações de código de renderização para cada nível de recurso no jogo e, se tiver texturas, sombreadores compilados ou outros recursos usados apenas em um ou em um subconjunto de todos os níveis de recursos compatíveis, coloque os recursos correspondentes apenas nos diretórios dos níveis de recursos que os usam. Para ativos carregados em todos os níveis de recurso, certifique-se de que cada diretório de recursos de nível de recurso tenha uma versão com o mesmo nome. Por exemplo, para uma textura independente de nível de recurso chamada "coolsign.dds", coloque a versão compactada BC3 no diretório \dxfl-dx9 e a versão compactada BC7 no diretório \dxfl-dx11.

  • Certifique-se de que cada ativo (se estiver disponível para vários níveis de recursos) tenha o mesmo nome em cada diretório. Por exemplo, coolsign.dds deve ter o mesmo nome nos diretórios \dxfl-dx9 e \dxfl-dx11, mesmo que o conteúdo do arquivo seja diferente. Nesse caso, você os veria como \dxfl-dx9\coolsign.dds e \dxfl-dx11\coolsign.dds.

    Observação Novamente, você pode, opcionalmente, acrescentar o sufixo de nível de recurso ao nome do arquivo e armazená-los no mesmo diretório; por exemplo, \textures\coolsign_dxfl-dx9.dds, \textures\coolsign_dxfl-dx11.dds.

     

  • Declare os níveis de recursos do DirectX com suporte ao configurar seus recursos gráficos.

    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> device;
    ComPtr<ID3D11DeviceContext> context;
    D3D11CreateDevice(
        nullptr,                    // Use the default adapter.
        D3D_DRIVER_TYPE_HARDWARE,
        0,                      // Use 0 unless it is a software device.
        creationFlags,          // defined above
        featureLevels,          // What the app will support.
        ARRAYSIZE(featureLevels),
        D3D11_SDK_VERSION,      // This should always be D3D11_SDK_VERSION.
        &device,                    // created device
        &m_featureLevel,            // The feature level of the device.
        &context                    // The corresponding immediate context.
    );
    
  • Use as APIs em Windows.ApplicationModel.Resources.Core para carregar os recursos. As referências de ativos devem ser generalizadas (sem sufixo), deixando de fora o nível do recurso. No entanto, ao contrário da linguagem e da escala, o sistema não determina automaticamente qual nível de recurso é ideal para uma determinada exibição; Isso é deixado para você determinar com base na lógica do código. Depois de fazer essa determinação, use as APIs para informar o sistema operacional sobre o nível de recurso preferencial. O sistema poderá então recuperar o ativo correto com base nessa preferência. Aqui está um exemplo de código que mostra como informar seu aplicativo sobre o nível de recurso atual do DirectX para a plataforma:

    // Set the current UI thread's MRT ResourceContext's DXFeatureLevel with the right DXFL. 
    
    Platform::String^ dxFeatureLevel;
        switch (m_featureLevel)
        {
        case D3D_FEATURE_LEVEL_9_1:
        case D3D_FEATURE_LEVEL_9_2:
        case D3D_FEATURE_LEVEL_9_3:
            dxFeatureLevel = L"DX9";
            break;
        case D3D_FEATURE_LEVEL_10_0:
        case D3D_FEATURE_LEVEL_10_1:
            dxFeatureLevel = L"DX10";
            break;
        default:
            dxFeatureLevel = L"DX11";
        }
    
        ResourceContext::SetGlobalQualifierValue(L"DXFeatureLevel", dxFeatureLevel);
    

Observação

Em seu código, carregue a textura diretamente pelo nome (ou caminho abaixo do diretório de nível de recurso). Não inclua o nome do diretório no nível do recurso ou o sufixo. Por exemplo, carregue "textures\coolsign.dds", não "dxfl-dx11\textures\coolsign.dds" ou "textures\coolsign_dxfl-dx11.dds".

  • Agora use o ResourceManager para localizar o arquivo que corresponde ao nível de recurso atual do DirectX. O ResourceManager retorna um ResourceMap, que você consulta com ResourceMap::GetValue (ou ResourceMap::TryGetValue) e um ResourceContext fornecido. Isso retorna um ResourceCandidate que mais se aproxima do nível de recurso do DirectX que foi especificado chamando SetGlobalQualifierValue.

    // An explicit ResourceContext is needed to match the DirectX feature level for the display on which the current view is presented.
    
    auto resourceContext = ResourceContext::GetForCurrentView();
    auto mainResourceMap = ResourceManager::Current->MainResourceMap;
    
    // For this code example, loader is a custom ref class used to load resources.
    // You can use the BasicLoader class from any of the 8.1 DirectX samples similarly.
    
    
    auto possibleResource = mainResourceMap->GetValue(
        L"Files/BumpPixelShader.cso",
        resourceContext
    );
    Platform::String^ resourceName = possibleResource->ValueAsString;
    
  • No Visual Studio 2015, selecione PROJECT-Store-Create>> App Package... e crie o pacote.

  • Certifique-se de habilitar pacotes de aplicativos nas configurações de manifesto package.appxmanifest.