Compartir a través de


Empaquetar tu juego directX de Plataforma universal de Windows (UWP)

Juegos de Plataforma universal de Windows más grandes (UWP), especialmente aquellos que admiten varios lenguajes 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 para UWP puede tener uno o varios paquetes de recursos, incluidos los paquetes de recursos para recursos o texturas de alta definición, recursos de nivel de característica 11+ de DirectX o recursos 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 la Estados Unidos como en Japón, es posible que necesites un conjunto de archivos de voz en inglés para las configuraciones locales en-us y otro en japonés para la configuración regional 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 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 usa en un nombre de archivo en lugar de solo en un nombre de directorio, un calificador de idioma debe adoptar la forma "lang-tag<>", por ejemplo, "lang-en-us", como se describe en Adaptar los 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 ruta de acceso debe generalizarse, quitar los calificadores para el nivel de característica de lenguaje, escala o DirectX, tanto si están en nodos de carpeta como 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 recurso 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 activo 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.
Escalado de recursos de factor scale-100, scale-140, scale-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 características 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 denominados para el 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 aunque el contenido del archivo sea para un idioma diferente. En este caso, los vería como \en-us\menu_option1.png y \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.

Definición de 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 compatible con PPP y tener en cuenta el factor de escalado para 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 del puntero y las pruebas de posicionamiento.

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 del factor de escalado de todos los recursos en cada directorio de recursos de factor de escala, incluso si no son diferentes en los factores de escalado.

  • Asegúrese de que cada recurso tenga el mismo nombre en cada directorio. Por ejemplo, menu_option1.png deben 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 y \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 admitida
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 del sombreador compilado se pueden crear por característica y se pueden incluir en los paquetes de recursos de nivel de características de DirectX. Además, algunos modelos de sombreador de versiones posteriores pueden usar recursos, como asignaciones normales, que las versiones anteriores del modelo 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 sub niveles (versiones de puntos), como DX9_1 frente a DX9_3, el código de representación y administración de recursos debe controlarlos 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 recursos específicos de nivel de característica en cada directorio de recursos de nivel de característica. 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 el código, cargue la textura directamente por su nombre (o ruta de acceso por debajo del directorio de nivel de característica). 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. ResourceManager devuelve un ResourceMap, que se consulta con ResourceMap::GetValue (o ResourceMap::TryGetValue) y un ResourceContext proporcionado. Esto devuelve un ResourceCandidate que coincide con el nivel de característica directX especificado mediante una llamada 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.