A Unreal Engine usa perfis de dispositivo e configurações de escalabilidade para personalizar as configurações de renderização por hardware. As configurações de escalabilidade definem os níveis de qualidade para funcionalidades individuais, como sombras, folhagem e detalhes de malha, condensando uma matriz de configurações diferentes em um valor facilmente redimensionável. Em seguida, os perfis de dispositivo mapeiam essas configurações para dispositivos compatíveis com eles.
O Android tem uma grande matriz de perfis que correspondem a famílias de GPU específicas. Este guia explicará as regras de correspondência de dispositivos, como editá-las e como você pode trabalhar com configurações de escalabilidade para criar perfis que atendam às necessidades específicas do seu jogo.
Configurações e ordem de prioridade
Configurações na Unreal Engine são lidas do diretório de instalação da Engine e da pasta do projeto. A pasta Engine/Config define as configurações básicas da Engine. Depois disso, elas se substituem na seguinte ordem:
Engine/Config/Base*.iniProject/Config/Base*.iniEngine/Config/Android/Android*.iniProject/Config/Android/Android*.ini
Por exemplo, o arquivo AndroidDeviceProfiles.ini em Engine/Config/Android tem precedência sobre BaseDeviceProfiles.ini tanto em Engine/Config quanto em Project/Config. AndroidDeviceProfiles.ini em Project/Config/Android tem precedência sobre todas as configurações acima.
Perfis de dispositivos Android
Os perfis de dispositivo Android padrão são Android_Low, Android_Mid e Android_High. O perfil Android_High representa o intervalo completo de funcionalidades que a Unreal Engine aceita nos dispositivos Android mais avançados, enquanto o perfil Android_Low representa o conjunto mínimo de funcionalidades para os dispositivos Android mais simples.
Também categorizamos perfis de dispositivos mais específicos com base nas famílias de GPU compatíveis com a Unreal Engine, pois os dispositivos móveis com a mesma GPU geralmente têm características de desempenho semelhantes. Esses perfis de dispositivo específicos da GPU geralmente mapeiam um dos perfis padrão (como Android_High) para dispositivos específicos, mas ocasionalmente precisam fornecer ajustes especiais.
Por exemplo, os seguintes perfis de dispositivo são para dispositivos Adreno 5XX na 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=1O perfil de dispositivo Android_Adreno5x padrão herda as propriedades de Android_High para todas as configurações básicas, com apenas uma sobreposição para rDisjointTimerQueries. O perfil Android_Adreno5x_No_Vulkan herda a herança do perfil Android_Adreno5x padrão e fornece outra sobreposição que desativa o suporte para o renderizador Vulkan devido a problemas em dispositivos Adreno5X mais antigos.
Dependendo do conteúdo do jogo, pode ser necessário substituir perfis existentes ou fornecer novos perfis na configuração AndroidDeviceProfiles.ini do projeto. Você pode ampliar esses perfis específicos da GPU para representar mais dispositivos específicos dessas famílias de GPU, se necessário, ou pode reescrever completamente qualquer perfil previamente definido.
Regras de correspondência de perfis de dispositivo
Quando um aplicativo da Unreal Engine é inicializado, ele carrega informações sobre o dispositivo que o está executando. O aplicativo itera em seguida uma lista de regras que identificam dispositivos com base nesses parâmetros. Elas podem ser encontradas em **BaseDeviceProfiles.ini**, na seção [/Script/AndroidDeviceProfileSelector.AndroidDeviceProfileMatchingRules]. Quando a aplicativo encontra uma regra que corresponde às informações do dispositivo recuperadas, ela interrompe a execução na lista e usa esse perfil de dispositivo.
O formato de uma entrada nessa lista é o seguinte:
+MatchProfile=(Profile="Profile_Name", Match=( ( Rule 1 ), ( Rule 2 ), (...) )As regras em si são comparações de strings com o seguinte formato:
SourceType=[source string], CompareType=[comparison type], MatchString=[string to compare the source string to]Dependendo do valor fornecido para SourceType, será gerada uma saída de string de origem, que o sistema comparará com MatchString.
Estes são os valores válidos para SourceType e as saídas correspondentes da string de origem:
| Valor de SourceType | Descrição | Exemplo de saída |
|---|---|---|
| O número do modelo do dispositivo. | "Nexus 6" |
| Fabricante do dispositivo. | "NVidia" |
| A família de GPUs da GPU neste dispositivo. | "Adreno (TM) 320", "NVIDIA Tegra" |
| Versão OpenGL em execução no dispositivo. | OpenGL ES 3 |
| A versão do sistema operacional Android usada por este dispositivo. | Qualquer valor numérico. |
| Verifica se o aplicativo foi empacotado com o Vulkan habilitado e se o dispositivo é compatível com a versão necessária do Vulkan especificada nas Configurações de Projeto. |
|
| A versão do Vulkan usada pelo dispositivo, se disponível. | Qualquer valor numérico. |
| O valor de uma correspondência regex anterior na mesma entrada MatchProfile. | Qualquer informação anteriormente gerada como saída por uma correspondência de regex. |
Os tipos de comparação disponíveis são os seguintes:
| Tipo de comparação | Descrição |
|---|---|
| Realiza uma comparação que usa operadores regex em MatchString. |
| Verifica se os valores das duas strings são exatamente iguais. |
| Como |
| Verifica se os valores das duas strings não são os mesmos. |
| Como |
| Verifica se o valor numérico da string de origem é menor que MatchString. |
| Como |
| Como |
| Como |
| Verifica se o valor numérico da string de origem é maior que MatchString. |
| Como |
| Como |
| Como |
Como exemplo, veja a seguir uma entrada para dispositivos Mali T8XX na versão 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")))Essa entrada de MatchProfile tem três regras:
Deve haver uma correspondência de regex para a família de GPUs com a string "^Mali-T8".
A versão Android deve ter um ou mais dígitos, e os dígitos serão memorizados até que algo que não seja um dígito seja encontrado.
A versão Android obtida pela segunda regra deve ser inferior a 8.
Se todos esses critérios forem atendidos, o perfil Android_Mali_T8zz_No_Vulkan será usado.
As regras de perfil de dispositivo são listadas primeiro por fabricante e depois em ordem crescente, das especificações mais simples até as mais exigentes. Os perfis padrão do Android são listados como reservas caso nenhuma das regras se encaixe e o dispositivo específico não possa ser identificado.
Se você adicionar regras a essa lista, certifique-se de colocá-las na ordem adequada em relação a outros dispositivos da mesma família.
Habilitar o Vulkan
Um parâmetro especial chamado VulkanAvailable é usado para identificar se um dispositivo pode ou não usar o renderizador Android Vulkan. Primeiro, ele verifica se o jogo tem a compatibilidade com Vulkan habilitada e, em seguida, verifica se o dispositivo tem drivers Vulkan. Se essas duas condições forem atendidas, VulkanAvailable será considerado verdadeiro.
Os dispositivos compatíveis com Vulkan têm perfis com e sem o Vulkan habilitado para considerar projetos que não usam o Vulkan, mesmo que ele esteja disponível no dispositivo alvo. Todos os perfis têm um parâmetro chamado r.Android.DisableVulkanSupport, que está definido como 1 por padrão. Perfis de dispositivo habilitados para Vulkan substituem esse parâmetro por 0.
A habilitação do Vulkan só é recomendada para dispositivos com Android 9 ou superior, pois os primeiros dispositivos compatíveis com Vulkan apresentavam vários bugs em seus drivers.
Configurações de escalabilidade
As Configurações de escalabilidade base da Unreal Engine estão definidas em Engine/Config/BaseScalability.ini, que podem ser encontradas no diretório de instalação da engine. As Configurações de escalabilidade para dispositivos Android estão definidas em Engine/Config/Android/AndroidScalability.ini.
Sobre valores de escalabilidade
As configurações de escalabilidade recebem amplos conjuntos de parâmetros e os condensam em amplas categorias que podem ser definidas com valores simples entre 0 e 3. Por exemplo, este é o mapeamento de escalabilidade para ShadowQuality nível 0 em 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 um dos valores listados representa funcionalidades muito específicas e tem uma escala própria. Por exemplo, algumas funcionam em termos de resolução de pixels, outras em termos de um fator de escala que multiplica um valor padrão e outras são mais arbitrárias. Pode ser difícil defini-las por funcionalidade, e elas precisam ser ajustadas entre os lançamentos, pois o hardware é atualizado com frequência.
Portanto, usamos ShadowQuality para condensar um grupo de configurações relacionadas em um valor único legível por humanos. A entrada acima define como todos esses valores se comportam quando sg.ShadowQuality está definido como 0 em um arquivo de configuração. Existem entradas semelhantes para ShadowQuality@1 até 3.
As diretrizes para esses valores de escalabilidade padrão são as seguintes:
| Valor de escalabilidade | Descrição |
|---|---|
0 | Qualidade baixa. As configurações mais baixas compatíveis com o intervalo mínimo de hardware compatível com a Unreal Engine. |
1 | Qualidade média. Configurações confortáveis em um amplo intervalo de hardware, entre os dispositivos mais simples e mais avançados em que a Unreal Engine foi testada. |
2 | Alta qualidade. Configurações compatíveis com a maioria dos hardware de última geração testados com a Unreal Engine. |
3 | Qualidade da Epic. Os valores mais altos possíveis para um determinado recurso na versão atual da Unreal Engine. |
Substituir configurações de escalabilidade
Para substituir configurações de escalabilidade, crie AndroidScalability.ini no diretório Config do projeto. Por exemplo, se você tiver um projeto chamado AndroidQuickStart, coloque-o em AndroidQuickStart/Config/Android.
Quaisquer configurações de escalabilidade criadas nesse arquivo terão precedência sobre as configurações definidas em Engine/Config/Android/AndroidScalability.ini.
Configuração de valores de escalabilidade em perfis de dispositivo
Para fazer referência a um valor de escalabilidade em perfis de dispositivo, use o prefixo sg. seguido do nome do valor que você deseja definir. Por exemplo, se quiser definir ShadowQuality como 1 em um perfil de dispositivo, use o seguinte:
+CVars=sg.ShadowQuality = 1Todas as configurações listadas após o valor de escalabilidade terão precedência sobre o valor original. No entanto, recomendamos alterar os parâmetros de escalabilidade nos arquivos *Scalability.ini e observar os grupos de escalabilidade de maneira consistente, em vez de alterar parâmetros de pequena escala em perfis de dispositivo. Isso garante que o Nível de renderização da pré-visualização dentro do editor aplique os valores de escalabilidade móvel com precisão.
Alterar configurações de escalabilidade em tempo de execução
As configurações de escalabilidade iniciais selecionadas por um perfil de dispositivo são apenas os padrões, e a escalabilidade pode ser facilmente alterada em tempo de execução usando vários métodos.
Como usar o menu Configurações no Unreal Editor
Para fins de teste, você pode alterar as configurações de escalabilidade do jogo dentro do Unreal Editor clicando no menu suspenso Configurações na barra de ferramentas e navegando até Configurações de escalabilidade da Engine.
Todas as alterações feitas nesse menu são aplicadas imediatamente.
Alterar configurações de escalabilidade com comandos do console
Você também pode fazer referência a qualquer configuração de escalabilidade como um comando do console. Por exemplo, se você digitar sg.FoliageQuality 2 no console e pressionar a tecla Enter, o valor de todas as CVars em FoliageQuality mudará de acordo.
Os valores no menu Configurações de escalabilidade da Engine refletirão essa alteração.
Você também pode gerar a saída do valor atual de uma configuração de escalabilidade digitando o nome como um comando de console, sem valor numérico. Por exemplo, se você digitar sg.FoliageQuality e pressionar Enter, o console imprimirá o valor atual de FoliageQuality e o último local onde ele foi definido.
Alterar configurações de escalabilidade no blueprint
Embora seja possível usar comandos do console por meio do blueprint para alterar as configurações de escalabilidade, elas também são acessíveis por funções dedicadas como parte das Configurações do usuário do jogo, às quais você pode obter uma referência usando o nó Obter configurações do usuário do jogo.
É possível usar essa funcionalidade junto com o UMG para compilar menus em que os usuários podem alterar essas configurações. Isso permite que os usuários personalizem os gráficos e o desempenho de um jogo como desejarem.
Alterar configurações de escalabilidade em C++
Em C++ , as configurações de usuários do jogo podem ser acessadas com a função estática UGameUserSettings::GetGameUserSettings. Em seguida, você pode usar as funções específicas "get" e "set" para obter e definir o nível de qualidade nas configurações de escalabilidade.
#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();