Unreal Engine utiliza perfiles de dispositivo y ajustes de escalabilidad para personalizar los ajustes de renderizado en función del hardware. Los ajustes de escalabilidad definen los niveles de calidad de funciones individuales como las sombras, el follaje y el detalle de la malla, condensando una matriz de ajustes distintos en un solo valor fácilmente escalable. A continuación, los perfiles de los dispositivos asignan esos ajustes a los dispositivos que sean compatibles con ellos.
Android cuenta con una gran matriz de perfiles que se adaptan a familias de GPU específicas. Esta guía explica las reglas de emparejamiento de dispositivos, cómo editarlas y cómo puedes trabajar con los ajustes de escalabilidad para crear perfiles que se ajusten a las necesidades específicas de tu juego.
Configuraciones y orden de prioridad
Las configuraciones de Unreal Engine se leen tanto del directorio de instalación del motor como de la carpeta del proyecto. La carpeta Engine/Config establece los ajustes de configuración básicos para el motor. Después de eso, se anulan entre sí en el siguiente orden:
Engine/Config/Base*.iniProject/Config/Base*.iniEngine/Config/Android/Android*.iniProject/Config/Android/Android*.ini
Por ejemplo, el archivo AndroidDeviceProfiles.ini en Engine/Config/Android tiene prelación sobre BaseDeviceProfiles.ini tanto en Engine/Config como en Project/Config. El AndroidDeviceProfiles.ini en Project/Config/Android tiene prioridad sobre todos los anteriores.
Perfiles de dispositivos Android
Los perfiles estándar de los dispositivo Android son Android_Low, Android_Mid y Android_High. El perfil Android_High representa la gama completa de funciones que Unreal Engine admite en los dispositivos Android de gama alta, mientras que Android_Low representa el conjunto mínimo de funciones para los dispositivos Android de gama más baja.
También clasificamos perfiles de dispositivo más específicos en función de las familias de GPU compatibles con Unreal Engine, ya que los dispositivos móviles con la misma GPU suelen tener características de rendimiento similares. Estos perfiles de dispositivo específicos de la GPU suelen mapear uno de los perfiles estándar (como Android_High) a dispositivos concretos, pero en ocasiones necesitan proporcionar ajustes en casos especiales.
Por ejemplo, los siguientes perfiles de dispositivo son para dispositivos Adreno 5xx en Unreal Engine 4.24:
[Android_Adreno5xx DeviceProfile]
DeviceType=Android
BaseProfileName=Android_High
+CVars=r.DisjointTimerQueries=1
[Android_Adreno5xx_No_Vulkan DeviceProfile]
DeviceType=Android
BaseProfileName=Android_Adreno5xx;
There are several issues (vulkan sub-passes, occlusion queries) on devices running Android 7 and earlier
+CVars=r.Android.DisableVulkanSupport=1El perfil de dispositivo estándar Android_Adreno5xx se hereda de Android_High en todos sus ajustes básicos, con solo una anulación para rDisjointTimerQueries. El perfil Android_Adreno5xx_No_Vulkan hereda del perfil estándar Android_Adreno5xx y proporciona otra anulación que deshabilita la compatibilidad con el renderizador Vulkan debido a problemas en los dispositivos Adreno5xx más antiguos.
Dependiendo del contenido de tu juego, es posible que tengas que anular los perfiles existentes o proporcionar otros nuevos dentro del archivo AndroidDeviceProfiles.ini de tu proyecto. Si es necesario, puedes ampliar estos perfiles específicos de GPU para representar dispositivos incluso más concretos dentro de estas familias de GPU, o puedes reescribir por completo cualquier perfil definido previamente.
Reglas de coincidencia de perfiles de dispositivos
Cuando se inicia una aplicación de Unreal Engine, se carga información sobre el dispositivo en el que se ejecuta. A continuación, la aplicación itera a través de una lista de reglas que identifican los dispositivos en función de estos parámetros. Estos de pueden encontrar en **BaseDeviceProfiles.ini**, en la sección [/Script/AndroidDeviceProfileSelector.AndroidDeviceProfileMatchingRules]. Cuando la aplicación encuentra una regla que coincide con la información del dispositivo recuperada, deja de recorrer la lista y utiliza ese perfil de dispositivo.
El formato de una entrada en esta lista es el siguiente:
+MatchProfile=(Profile="Profile_Name", Match=( ( Rule 1 ), ( Rule 2 ), (...) )Las propias reglas son comparaciones de cadena que adoptan el siguiente formato:
SourceType=[source string], CompareType=[comparison type], MatchString=[string to compare the source string to]Dependiendo del valor que le des a SourceType, obtendrás una cadena fuente que el sistema comparará con MatchString.
Los valores válidos para SourceType y sus cadenas fuente correspondientes son los siguientes:
| Valor de SourceType | Descripción | Ejemplo de salida |
|---|---|---|
| El número de modelo del dispositivo. | "Nexus 6" |
| El fabricante del dispositivo. | "NVidia" |
| La familia de GPU de este dispositivo. | "Adreno (TM) 320", "NVIDIA Tegra" |
| La versión de OpenGL que se está ejecutando en este dispositivo. | OpenGL ES 3 |
| La versión del sistema operativo Android que utiliza este dispositivo. | Cualquier valor numérico. |
| Comprueba si la aplicación se ha empaquetado con Vulkan habilitado y si el dispositivo es compatible con la versión requerida de Vulkan especificada en tu configuración del proyecto. |
|
| La versión de Vulkan que utiliza este dispositivo, si está disponible. | Cualquier valor numérico. |
| El valor de una coincidencia de expresión regular anterior dentro de la misma entrada de MatchProfile. | Cualquier información previamente generada por una coincidencia de expresiones regulares. |
Los tipos de comparación disponibles son los siguientes:
| Tipo de comparación | Descripción |
|---|---|
| Realiza una comparación que utiliza operadores de expresiones regulares en MatchString. |
| Comprueba que los valores de las dos cadenas son exactamente iguales. |
| Como |
| Comprueba que los valores de las dos cadenas no sean iguales. |
| Como |
| Comprueba si el valor numérico de la cadena fuente es menor que MatchString. |
| Como |
| Como |
| Como |
| Comprueba si el valor numérico de la cadena fuente es mayor que MatchString. |
| Como |
| Como |
| Como |
Como ejemplo, la siguiente es una entrada para dispositivos Mali T8xx en 4.24:
+MatchProfile=(Profile="Android_Mali_T8xx_No_Vulkan",Match=((SourceType=SRC_GpuFamily,CompareType=CMP_Regex,MatchString="^Mali\\-T8"),(SourceType=SRC_AndroidVersion, CompareType=CMP_Regex,MatchString="([0-9]+).*"),(SourceType=SRC_PreviousRegexMatch,CompareType=CMP_Less,MatchString="8")))Esta entrada de MatchProfile tiene tres reglas:
Debe haber una coincidencia de expresión regular para la familia de GPU con la cadena "^Mali-T8".
La versión de Android debe tener uno o más dígitos y los dígitos se recordarán hasta que se encuentre uno que no sea un dígito.
La versión de Android obtenida a partir de la segunda regla debe ser anterior a la 8.
Si se cumplen todos estos criterios, se utilizará el perfil Android_Mali_T8xx_No_Vulkan.
Las reglas de los perfiles de dispositivos se enumeran primero por fabricante y luego en orden ascendente, desde las especificaciones más bajas a las más altas. Los perfiles estándar de Android se muestran como alternativas en caso de que ninguna de las reglas se ajuste y no se pueda identificar el dispositivo específico.
Si añades reglas a esta lista, asegúrate de colocarlas en el orden correcto en relación con otros dispositivos de la misma familia.
Cómo habilitar Vulkan
Se utiliza un parámetro especial llamado VulkanAvailable para determinar si un dispositivo puede utilizar o no el renderizador Vulkan de Android. Primero comprueba si el juego tiene el soporte para Vulkan habilitado, y a continuación, comprueba si el dispositivo cuenta con controladores Vulkan. Si se cumplen ambas condiciones, VulkanAvailable se considera activado.
Los dispositivos compatibles con Vulkan tienen perfiles con y sin Vulkan habilitado para tener en cuenta proyectos que no utilizan Vulkan aunque esté disponible en el dispositivo objetivo. Todos los perfiles tienen un parámetro llamado r.Android.DisableVulkanSupport, cuyo valor predeterminado es 1. Los perfiles de dispositivo con Vulkan habilitado anulan este parámetro a 0.
Solo se recomienda habilitar Vulkan en dispositivos con Android 9 o superior, ya que los primeros dispositivos compatibles con Vulkan tenían varios errores en sus controladores.
Ajustes de escalabilidad
Los ajustes de escalabilidad base de Unreal Engine se definen en Engine/Config/BaseScalability.ini, que se encuentra en tu directorio de instalación del motor. Los ajustes de escalabilidad para dispositivos Android se definen en Engine/Config/Android/AndroidScalability.ini.
Cómo interpretar los valores de escalabilidad
Los ajustes de escalabilidad toman amplios conjuntos de parámetros y los condensan en categorías generales que luego se pueden definir con valores simples entre 0 y 3. Por ejemplo, este es el mapeo de escalabilidad para ShadowQuality de nivel 0 en BaseScalability.ini:
[ShadowQuality@0]
r.LightFunctionQuality=0
r.ShadowQuality=0
r.Shadow.CSM.MaxCascades=1
r.Shadow.MaxResolution=512
r.Shadow.MaxCSMResolution=512
r.Shadow.RadiusThreshold=0.06
r.Shadow.DistanceScale=0.6
r.Shadow.CSM.TransitionScale=0
r.Shadow.PreShadowResolutionFactor=0.5
Cada uno de los valores enumerados representa funciones muy específicas, y cada uno de ellos tiene su propia escala. Por ejemplo, algunas funcionan en términos de resolución de píxeles, otras en términos de un factor de escala que multiplica un valor por defecto, y otras son más arbitrarias. Pueden resultar abrumador definirlas para cada función, y necesitan ser ajustadas entre versiones, ya que el hardware se actualiza con frecuencia.
Por lo tanto, utilizamos ShadowQuality para condensar un grupo de ajustes relacionados en un solo valor legible. La entrada anterior define cómo se comportan todos estos valores cuando se establece sg.ShadowQuality en 0 en un archivo de configuración. Existen entradas similares para ShadowQuality@1 a 3.
Las pautas para estos valores de escalabilidad por defecto son las siguientes:
| Valor de escalabilidad | Descripción |
|---|---|
0 | Calidad baja. Los ajustes más bajos que son compatibles con el intervalo mínimo de hardware que admite Unreal Engine. |
1 | Calidad media. Ajustes que funcionan bien en una amplia gama de dispositivos de hardware, entre los de gama más baja y los de gama más alta, en los que se ha probado Unreal Engine. |
2 | Calidad alta. Ajustes que funcionan bien en la mayoría de los dispositivos de hardware de gama alta en los que se ha probado Unreal Engine. |
3 | Calidad épica. Los valores más altos posibles para una función determinada en la versión actual de Unreal Engine. |
Cómo anular los ajustes de escalabilidad
Para anular los ajustes de escalabilidad, puedes crear un archivo AndroidScalability.ini en el directorio Config de tu proyecto. Por ejemplo, si tienes un proyecto llamado AndroidQuickStart, deberías colocarlo en AndroidQuickStart/Config/Android.
Cualquier ajuste de escalabilidad creado en este archivo tendrá prelación sobre los ajustes definidos en Engine/Config/Android/AndroidScalability.ini.
Cómo configurar los valores de escalabilidad en los perfiles de dispositivo
Para hacer referencia a un valor de escalabilidad en los perfiles de dispositivo, utiliza el prefijo sg. seguido del nombre del valor que quieras establecer. Por ejemplo, si quisieras establecer ShadowQuality a 1 en el perfil de un dispositivo, utilizarías lo siguiente:
+CVars=sg.ShadowQuality = 1Cualquier ajuste que se indique después de este valor de escalabilidad tendrá prelación sobre su valor original. Sin embargo, se recomienda encarecidamente que cambies los parámetros de escalabilidad dentro de tus archivos *Scalability.ini y observes los grupos de escalabilidad de forma coherente en lugar de cambiar los parámetros a pequeña escala dentro de los perfiles de dispositivo. Esto garantiza que el nivel de renderización de vista previa dentro del editor aplique con precisión los valores de escalabilidad móvil.
Cómo cambiar los ajustes de escalabilidad en tiempo de ejecución
Los ajustes escalabilidad iniciales seleccionados por un perfil de dispositivo son simplemente los valores por defecto, y la escalabilidad se puede cambiar fácilmente en tiempo de ejecución a través de una variedad de métodos.
Utilizando el menú de ajustes en Unreal Editor
Para fines de prueba, puedes cambiar los ajustes de escalabilidad de tu juego dentro de Unreal Editor haciendo clic en el desplegable Ajustes de la barra de herramientas y dirigiéndote a Configuración de la escalabilidad del motor.
Los cambios realizados en este menú se aplican inmediatamente.
Cambiar los ajustes de escalabilidad con comandos de consola
También puedes hacer referencia a cualquier ajustes de escalabilidad como un comando de consola. Por ejemplo, si escribes sg.FoliageQuality 2 en la consola y pulsas la tecla Intro, el valor de todas las variables de consola bajo FoliageQuality cambiará según corresponda.
Los valores del menú Configuración de la escalabilidad del motor reflejarán este cambio.
También puedes obtener el valor actual de un ajuste de escalabilidad escribiendo su nombre como un comando de consola, sin valor numérico. Por ejemplo, si escribes sg.FoliageQuality y pulsas Intro, la consola mostrará tanto el valor actual de FoliageQuality como el último lugar donde se estableció.
Cambiar los ajustes de escalabilidad en el blueprint
Aunque puedes utilizar comandos de consola a través del blueprint para cambiar los ajustes de escalabilidad, también se puede acceder a ellos a través de funciones dedicadas como parte de Ajustes de usuario del juego, de as que puedes obtener una referencia utilizando el nodo Get Game User Settings.
Puedes utilizar esta función junto con UMG para compilar menús donde tus usuarios puedan cambiar estos ajustes. Esto permite a los usuarios personalizar los gráficos y el rendimiento de un juego según se desee.
Cambiar la configuración de escalabilidad en C++
En C++ , se puede acceder a los ajustes de usuario del juego con la función estática UGameUserSettings::GetGameUserSettings. A continuación, puedes utilizar sus funciones get y set para obtener y establecer el nivel de calidad en los ajustes de escalabilidad.
#include "MyActor.h"
#include "GameUserSettings.h"
void AMyActor::SampleScalabilityFunctions()
{
//Getting a reference to the Game User Settings.
UGameUserSettings* UserSettings = UGameUserSettings::GetGameUserSettings();
//Getting the current Foliage Quality.
Int32 FoliageQuality = UserSettings->GetFoliageQuality();