Compartir a través de


Empaquetar tu juego DirectX para la Plataforma universal de Windows (UWP)

Los juegos de la Plataforma universal de Windows (UWP) más grandes, especialmente aquellos que admiten varios idiomas con recursos específicos de la región o con recursos opcionales de alta definición, pueden aumentar fácilmente a tamaños grandes. En este tema, aprenderá a usar paquetes de aplicaciones y agrupaciones de aplicaciones para personalizar la aplicación para que los clientes solo reciban los recursos que realmente necesitan.

Además del modelo de paquete de aplicaciones, Windows 10 admite agrupaciones de aplicaciones que agrupan dos tipos de paquetes:

  • Los paquetes de aplicaciones contienen archivos ejecutables y bibliotecas específicos de la plataforma. Normalmente, un juego para UWP puede tener hasta tres paquetes de aplicaciones: uno para las arquitecturas de CPU x86, x64 y Arm. Todo el código y los datos específicos de esa plataforma de hardware deben incluirse en su paquete de aplicaciones. Un paquete de aplicaciones también debe contener todos los recursos principales para que el juego se ejecute con un nivel de base de fidelidad y rendimiento.
  • Los paquetes de recursos contienen datos opcionales o expandidos independientes de la plataforma, como recursos de juego (texturas, mallas, sonido, texto). Un juego de UWP puede tener uno o varios paquetes de recursos, incluidos paquetes para activos o texturas de alta definición, recursos de nivel de función 11+ de DirectX o activos y recursos específicos del idioma.

Para obtener más información sobre los paquetes de aplicaciones y los paquetes de aplicaciones, lea Definición de los recursos de la aplicación.

Aunque puedes colocar todo el contenido en los paquetes de aplicaciones, esto es ineficaz y redundante. ¿Por qué el mismo archivo de textura grande se replica tres veces para cada plataforma, especialmente para las plataformas Arm que pueden no usarlas? Un buen objetivo es intentar minimizar lo que el cliente tiene que descargar, para que puedan empezar a jugar el juego antes, ahorrar espacio en su dispositivo y evitar posibles costos de ancho de banda medidos.

Para usar esta característica del instalador de aplicaciones para UWP, es importante tener en cuenta las convenciones de diseño de directorio y nomenclatura de archivos para el empaquetado de aplicaciones y recursos al principio del desarrollo de juegos, por lo que las herramientas y el origen pueden generarlos correctamente de una manera que haga que el empaquetado sea sencillo. Siga las reglas descritas en este documento al desarrollar o configurar la creación y administración de herramientas y scripts, y al crear código que cargue o haga referencia a recursos.

¿Por qué crear paquetes de recursos?

Cuando creas una aplicación, especialmente una aplicación de juego que se puede vender en muchas configuraciones regionales o en una amplia variedad de plataformas de hardware para UWP, a menudo necesitas incluir varias versiones de muchos archivos para admitir esas configuraciones regionales o plataformas. Por ejemplo, si publicas tu juego tanto en Estados Unidos como en Japón, es posible que necesites un conjunto de archivos de voz en inglés para las configuraciones regionales de en-us y otro en japonés para la configuración regional de jp-jp. O bien, si quieres usar una imagen en tu juego para dispositivos Arm, así como plataformas x86 y x64, debes cargar el mismo recurso de imagen 3 veces, una vez para cada arquitectura de CPU.

Además, si tu juego tiene muchos recursos de alta definición que no se aplican a plataformas con niveles de características de DirectX inferiores, ¿por qué incluirlos en el paquete de aplicaciones de línea base y requerir al usuario que descargue un gran volumen de componentes que el dispositivo no puede usar? Separar estos recursos de alta definición en un paquete de recursos opcional significa que los clientes con dispositivos que admiten esos recursos de alta definición pueden obtenerlos a costa del ancho de banda (posiblemente medido), mientras que aquellos que no tienen dispositivos de gama superior pueden obtener su juego más rápido y con un menor costo de uso de red.

Entre los candidatos de contenido para paquetes de recursos de juego se incluyen:

  • Recursos específicos de configuración regional internacional (texto localizado, audio o imágenes)
  • Recursos de alta resolución para diferentes factores de escalado de dispositivos (1,0x, 1,4x y 1,8x)
  • Recursos de alta definición para niveles de características de DirectX superiores (9, 10 y 11)

Todo esto se define en package.appxmanifest que forma parte del proyecto de UWP y en la estructura de directorios del paquete final. Debido a la nueva interfaz de usuario de Visual Studio, si sigue el proceso de este documento, no debe tener que editarla manualmente.

Importante La carga y administración de estos recursos se controla a través de las API de Windows.ApplicationModel.Resources* . Si usa estas API de recursos del modelo de aplicación para cargar el archivo correcto para un nivel de característica de configuración regional, factor de escalado o DirectX, no es necesario cargar los recursos mediante rutas de acceso de archivo explícitas; en su lugar, proporciona las API de recursos con solo el nombre de archivo generalizado del recurso que desea y permite que el sistema de administración de recursos obtenga la variante correcta del recurso para la configuración regional y la plataforma actual del usuario (que puede especificar directamente también con estas mismas API).

Los recursos para el empaquetado de recursos se especifican de una de las dos maneras básicas:

  • Los archivos de recursos tienen el mismo nombre de archivo y las versiones específicas del paquete de recursos se colocan en directorios con nombre específicos. El sistema reserva estos nombres de directorio. Por ejemplo, \en-us, \scale-140, \dxfl-dx11.
  • Los archivos de recursos se almacenan en carpetas con nombres arbitrarios, pero los archivos se denominan con una etiqueta común que se anexa con cadenas reservadas por el sistema para indicar el idioma u otros calificadores. En concreto, las cadenas de calificador se fijan en el nombre de archivo generalizado después de un carácter de subrayado ("_"). Por ejemplo, \assets\menu_option1_lang-en-us.png, \assets\menu_option1_scale-140.png, \assets\coolsign_dxfl-dx11.dds. También puede combinar estas cadenas. Por ejemplo, \assets\menu_option1_scale-140_lang-en-us.png.

    Nota Cuando se utiliza en un nombre de archivo, en lugar de solo en un nombre de directorio, un calificador de idioma debe tener la forma "lang-<tag>", por ejemplo, "lang-en-us", como se describe en Personaliza tus recursos para el idioma, la escala y otros calificadores.

Los nombres de directorio se pueden combinar para una especificidad adicional en el empaquetado de recursos. Sin embargo, no pueden ser redundantes. Por ejemplo, \en-us\menu_option1_lang-en-us.png es redundante.

Puede especificar cualquier nombre de subdirectorio no reservado que necesite debajo de un directorio de recursos, siempre y cuando la estructura de directorios sea idéntica en cada directorio de recursos. Por ejemplo, \dxfl-dx10\assets\textures\coolsign.dds. Al cargar o hacer referencia a un recurso, el nombre de la ruta de acceso debe generalizarse, eliminando los calificadores de lenguaje, escala o nivel de características de DirectX, ya sea en los nodos de carpeta o en los nombres de archivo. Por ejemplo, para hacer referencia en el código a un recurso para el que una de las variantes es \dxfl-dx10\assets\textures\coolsign.dds, use \assets\textures\coolsign.dds. Del mismo modo, para hacer referencia a un activo con una variante \images\background_scale-140.png, use \images\background.png.

Estos son los siguientes nombres de directorio reservados y prefijos de subrayado de nombre de archivo:

Tipo de recurso Nombre del directorio del paquete de recursos Sufijo de nombre de archivo del paquete de recursos
Recursos localizados Todos los idiomas posibles, o combinaciones de idioma y configuración regional, para Windows 10. (El prefijo de calificador "lang-" no es necesario en un nombre de carpeta). Un valor "_" seguido del especificador de idioma, configuración regional o configuración regional del idioma. Por ejemplo, "_en", "_us" o "_en-us", respectivamente.
Activos del factor de escala escala-100, escala-140, escala-180. Estos son para los factores de escalado de la interfaz de usuario 1.0x, 1.4x y 1.8x, respectivamente. Un "_" seguido de "scale-100", "scale-140" o "scale-180".
Recursos de nivel de funcionalidad de DirectX dxfl-dx9, dxfl-dx10 y dxfl-dx11. Estos son para los niveles de características de DirectX 9, 10 y 11, respectivamente. Un "_" seguido de "dxfl-dx9", "dxfl-dx10" o "dxfl-dx11".

 

Definición de paquetes de recursos de idioma localizados

Los archivos específicos de la configuración regional se colocan en directorios de proyecto que llevan el nombre del idioma (por ejemplo, "en").

Al configurar la aplicación para que admita recursos localizados para varios idiomas, debe hacer lo siguiente:

  • Cree un subdirectorio de aplicación (o versión de archivo) para cada idioma y configuración regional que admita (por ejemplo, en-us, jp-jp, zh-cn, fr-fr, etc.).

  • Durante el desarrollo, coloque copias de todos los recursos (como archivos de audio localizados, texturas y gráficos de menú) en el subdirectorio de configuración regional del idioma correspondiente, incluso si no son diferentes entre idiomas o configuraciones regionales. Para obtener la mejor experiencia del usuario, asegúrese de que el usuario se le avise si no ha obtenido un paquete de recursos de idioma disponible para su configuración regional si está disponible (o si lo ha eliminado accidentalmente después de la descarga e instalación).

  • Asegúrese de que cada recurso o archivo de recursos de cadena (.resw) tenga el mismo nombre en cada directorio. Por ejemplo, menu_option1.png debe tener el mismo nombre en los directorios \en-us y \jp-jp incluso si el contenido del archivo es para un idioma diferente. En este caso, los vería como \en-us\menu_option1.png and \jp-jp\menu_option1.png.

    Nota Opcionalmente, puede anexar la configuración regional al nombre de archivo y almacenarla en el mismo directorio; por ejemplo, \assets\menu_option1_lang-en-us.png, \assets\menu_option1_lang-jp-jp.png.

     

  • Use las API de Windows.ApplicationModel.Resources y Windows.ApplicationModel.Resources.Core para especificar y cargar los recursos específicos de la configuración regional de la aplicación. Además, use referencias de recursos que no incluyan la configuración regional específica, ya que estas API determinan la configuración regional correcta en función de la configuración del usuario y, a continuación, recuperan el recurso correcto para el usuario.

  • En Microsoft Visual Studio 2015, seleccione PROJECT-Store-Create>> App Package... y cree el paquete.

Definir paquetes de recursos de factor de escalado

Windows 10 proporciona tres factores de escalado de la interfaz de usuario: 1.0x, 1.4x y 1.8x. Los valores de escalado de cada pantalla se establecen durante la instalación en función de una serie de factores combinados: el tamaño de la pantalla, la resolución de la pantalla y la distancia media asumida del usuario desde la pantalla. El usuario también puede ajustar los factores de escala para mejorar la legibilidad. Tu juego debe ser consciente de los puntos por pulgada (ppp) y del factor de escalado para ofrecer la mejor experiencia posible. Parte de este conocimiento significa crear versiones de recursos visuales críticos para cada uno de los tres factores de escalado. Esto también incluye la interacción con el puntero y la detección de impactos.

Al configurar la aplicación para admitir paquetes de recursos para diferentes factores de escalado de aplicaciones para UWP, debes:

  • Cree un subdirectorio de aplicación (o versión de archivo) para cada factor de escalado que admita (scale-100, scale-140 y scale-180).

  • Durante el desarrollo, coloque copias adecuadas para el factor de escala de TODOS los recursos en cada directorio de recursos de factor de escala, incluso si no varían entre los factores de escala.

  • Asegúrese de que cada recurso tenga el mismo nombre en cada directorio. Por ejemplo, menu_option1.png debe tener el mismo nombre en los directorios \scale-100 y \scale-180 aunque el contenido del archivo sea diferente. En este caso, los vería como \scale-100\menu_option1.png and \scale-140\menu_option1.png.

    Nota De nuevo, puede anexar opcionalmente el sufijo factor de escalado al nombre de archivo y almacenarlos en el mismo directorio; por ejemplo, \assets\menu_option1_scale-100.png, \assets\menu_option1_scale-140.png.

     

  • Use las API de Windows.ApplicationModel.Resources.Core para cargar los recursos. Las referencias de recursos deben generalizarse (sin sufijo), dejando fuera la variación de escala específica. El sistema recuperará el recurso de escalado adecuado para la pantalla y la configuración del usuario.

  • En Visual Studio 2015, seleccione PROJECT-Store-Create>> App Package... y cree el paquete.

Definición de paquetes de recursos de nivel de características de DirectX

Los niveles de características de DirectX corresponden a conjuntos de características de GPU para versiones anteriores y actuales de DirectX (en concreto, Direct3D). Esto incluye especificaciones y funcionalidades del modelo de sombreador, compatibilidad con lenguaje de sombreador, compatibilidad con compresión de texturas y características generales de canalización de gráficos.

El paquete de aplicaciones de línea base debe usar los formatos de compresión de textura de línea base: BC1, BC2 o BC3. Estos formatos pueden ser consumidos por cualquier dispositivo UWP, desde plataformas Arm de gama baja hasta estaciones de trabajo y equipos multimedia dedicados de varias GPU.

La compatibilidad con el formato de textura en el nivel de característica 10 o posterior de DirectX debe agregarse en un paquete de recursos para conservar el espacio en disco local y descargar el ancho de banda. Esto permite usar los esquemas de compresión más avanzados para 11, como BC6H y BC7. (Para obtener más información, consulte Compresión de bloques de textura en Direct3D 11). Estos formatos son más eficaces para los recursos de textura de alta resolución compatibles con GPU modernas y su uso mejora los requisitos de aspecto, rendimiento y espacio de tu juego en plataformas de gama alta.

Nivel de característica de DirectX Compresión de textura compatible
9 BC1, BC2, BC3
10 BC4, BC5
11 BC6H, BC7

 

Además, cada nivel de característica de DirectX admite diferentes versiones del modelo de sombreador. Los recursos de sombreador compilados se pueden crear a nivel de característica y se pueden incluir en paquetes de recursos a nivel de características de DirectX. Además, algunos modelos de sombreador de versiones posteriores pueden usar recursos, como mapas normales, que las versiones anteriores de modelos de sombreador no pueden. Estos recursos específicos del modelo de sombreador también deben incluirse en un paquete de recursos de nivel de característica de DirectX.

El mecanismo de recursos se centra principalmente en los formatos de textura admitidos para los recursos, por lo que solo admite los tres niveles generales de características. Si necesita tener sombreadores independientes para subniveles, como DX9_1 versus DX9_3, su código de administración de recursos y representación debe manejarlos explícitamente.

Al configurar la aplicación para admitir paquetes de recursos para distintos niveles de características de DirectX, debe:

  • Cree un subdirectorio de aplicación (o versión de archivo) para cada nivel de característica de DirectX que admita (dxfl-dx9, dxfl-dx10 y dxfl-dx11).

  • Durante el desarrollo, coloque los recursos específicos para cada nivel de característica en sus respectivos directorios de recursos. A diferencia de las configuraciones regionales y los factores de escalado, puedes tener ramas de código de representación diferentes para cada nivel de característica del juego y si tienes texturas, sombreadores compilados u otros recursos que solo se usan en uno o un subconjunto de todos los niveles de características admitidos, coloca los recursos correspondientes solo en los directorios de los niveles de características que los usan. En el caso de los recursos que se cargan en todos los niveles de características, asegúrese de que cada directorio de recursos de nivel de característica tenga una versión de él con el mismo nombre. Por ejemplo, para una textura independiente de nivel de característica denominada "coolsign.dds", coloque la versión comprimida por BC3 en el directorio \dxfl-dx9 y la versión comprimida de BC7 en el directorio \dxfl-dx11.

  • Asegúrese de que cada recurso (si está disponible para varios niveles de características) tiene el mismo nombre en cada directorio. Por ejemplo, coolsign.dds debe tener el mismo nombre en los directorios \dxfl-dx9 y \dxfl-dx11 aunque el contenido del archivo sea diferente. En este caso, los vería como \dxfl-dx9\coolsign.dds y \dxfl-dx11\coolsign.dds.

    Nota De nuevo, puede anexar opcionalmente el sufijo de nivel de característica al nombre de archivo y almacenarlos en el mismo directorio; por ejemplo, \textures\coolsign_dxfl-dx9.dds, \textures\coolsign_dxfl-dx11.dds.

     

  • Declare los niveles de características de DirectX admitidos al configurar los 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 las API de Windows.ApplicationModel.Resources.Core para cargar los recursos. Las referencias de recursos deben generalizarse (sin sufijo), dejando fuera el nivel de característica. Sin embargo, a diferencia del idioma y la escala, el sistema no determina automáticamente qué nivel de característica es óptimo para una pantalla determinada; que le queda para determinar en función de la lógica de código. Una vez que realice esa determinación, use las API para informar al sistema operativo del nivel de característica preferido. Después, el sistema podrá recuperar el recurso correcto en función de esa preferencia. Este es un ejemplo de código que muestra cómo informar a la aplicación del nivel de característica actual de DirectX para la 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);
    

Nota:

En tu código, carga la textura directamente por su nombre (o por la ruta bajo el directorio de nivel de funcionalidad). No incluya el nombre del directorio de nivel de característica ni el sufijo. Por ejemplo, cargue "textures\coolsign.dds", no "dxfl-dx11\textures\coolsign.dds" o "textures\coolsign_dxfl-dx11.dds".

  • Ahora use resourceManager para buscar el archivo que coincide con el nivel de característica actual de DirectX. El ResourceManager devuelve un ResourceMap, que se consulta con ResourceMap::GetValue (o ResourceMap::TryGetValue) y un proporcionado ResourceContext. Esto devuelve un ResourceCandidate que coincide más estrechamente con el nivel de característica de DirectX especificado al llamar a 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;
    
  • En Visual Studio 2015, seleccione PROJECT-Store-Create>> App Package... y cree el paquete.

  • Asegúrese de habilitar agrupaciones de aplicaciones en la configuración del manifiesto package.appxmanifest.