Maior fidelidade e taxas de quadros mais suaves com Adaptive Performance

Encerramos recentemente a GDC 2019, onde falamos sobre Adaptive Performance durante nossa palestra. Temos o prazer de informar que a versão de pré-visualização e a amostra para celular do Megacity já estão disponíveis para que você possa começar a explorar esse recurso. Este blog explica mais sobre o Adaptive Performance e como aplicá-lo aos seus próprios projetos.
Ao contrário de um jogo de PC ou console, aproveitar todo o poder do hardware móvel requer um equilíbrio delicado para que os jogos tenham uma aparência bonita e sejam executados sem problemas. Esgotar os recursos de um dispositivo pode comprometer rapidamente o desempenho do seu jogo, sobrecarregando o hardware, o que leva a limitações, baixa duração da bateria e desempenho inconsistente. Para os desenvolvedores, essa questão se torna ainda mais problemática considerando a ampla gama de dispositivos de baixo custo e alto desempenho.
Hoje em dia, os desenvolvedores adotam táticas diferentes para resolver esse problema. As duas principais abordagens que vimos são: tentar garantir que os jogos tenham o melhor desempenho em todos os hardwares de destino, o que significa sacrificar a fidelidade gráfica e a taxa de quadros, ou tentar antecipar o comportamento do hardware, o que é realmente difícil porque não há muitas opções para medir com precisão as tendências do hardware.
O Adaptive Performance oferece uma maneira melhor de gerenciar as temperaturas e o desempenho dos seus jogos em um dispositivo em tempo real, permitindo que você ajuste proativamente as configurações de desempenho e qualidade do seu jogo e utilize o hardware sem sobrecarregar o dispositivo. O resultado é uma taxa de quadros previsível e uma redução no acúmulo térmico, permitindo tempos de jogo mais longos e uma experiência de jogo muito mais agradável, ao mesmo tempo em que preserva a vida útil da bateria.
Para os desenvolvedores, isso significa ter uma visão nova e mais profunda do hardware com novas ferramentas para tornar seus jogos mais dinâmicos e flexíveis, proporcionando aos seus jogadores as experiências mais suaves e de melhor desempenho quando estiverem jogando em dispositivos móveis. Ele lhe dá controle sobre decisões que normalmente são tomadas pelo sistema operacional, como quando executar em altas velocidades de clock ou o que ajustar para evitar limitação.
Fizemos várias palestras sobre esse recurso durante a GDC 2019. Você pode ver o slide deck aqui e assistir à palestra no estande da Unity GDC - Megacity no celular: Veja abaixo como otimizamos isso com o Adaptive Performance .
Fizemos uma parceria com a Samsung, a maior fabricante de dispositivos móveis Android do mundo, para ajudar a concretizar essa solução. Desenvolvido com base no GameSDK da Samsung, o Adaptive Performance estará disponível primeiro para dispositivos Samsung Galaxy, como o Samsung Galaxy S10 e o Galaxy Fold, seguido por outros dispositivos Samsung Galaxy ainda este ano.
Esses gráficos (mostrados durante nossa palestra principal na Unity na GDC 2019) ilustram como o Adaptive Performance ajuda a fornecer uma alta taxa de quadros constante com o Megacity em execução no novo Samsung Galaxy S10.

Em vermelho, você pode ver a taxa de quadros no Megacity antes de adicionarmos o Adaptive Performance; e em azul, você pode ver os resultados depois de adicionarmos o Adaptive Performance. Com o Adaptive Performance, a demonstração roda a 30 fps por muito mais tempo e é muito mais estável.

Megacity é uma cidade interativa e futurista com milhões de entidades, demonstrando como a Unity pode executar até mesmo os projetos mais complexos em hardware móvel de última geração. Ele apresenta os últimos avanços em nossa Pilha de Tecnologia Orientada a Dados (DOTS), o nome de todos os projetos sob nosso banner “Desempenho por Padrão”, incluindo Sistema de Componentes de Entidade (ECS), Collections Nativas, Sistema de Trabalho C# e o Compilador Burst . O Megacity foi apresentado pela primeira vez na Unite Los Angeles 2018 e foi lançado para desktop durante a GDC 2019.
Megacity é o projeto certo para demonstrar uma implementação de exemplo do Adaptive Performance, pois ele nos fornece a flexibilidade para adaptar o jogo de forma dinâmica e proativa para melhor utilizar o hardware. O Adaptive Performance foi criado com a escalabilidade em mente, o que funciona muito bem com os princípios do DOTS usados para construir a base no Megacity.
A versão móvel do projeto tem 4,5 milhões de renderizadores de malha, 200 mil componentes de construção, 100 mil fontes de áudio e mais de 6 milhões de entidades — um candidato ideal para demonstrar os recursos do Adaptive Performance.
Depois de instalar o Adaptive Performance por meio do Unity Package Manager, o Unity adiciona automaticamente o subsistema Samsung GameSDK ao seu projeto quando você compila para um dispositivo. Durante o tempo de execução, o Unity cria e inicia um Adaptive Performance Manager em dispositivos suportados, o que fornece feedback sobre o estado térmico do dispositivo móvel. Você pode assinar eventos ou consultar as informações do Adaptive Performance Manager durante o tempo de execução para reagir em tempo real; caso contrário, ele apenas reportará as estatísticas para o console.
Como exemplo, você pode usar a API fornecida para criar aplicativos que reagem às tendências e eventos térmicos no dispositivo. Isso garante taxas de quadros constantes por um período de tempo mais longo, evitando a limitação térmica, mesmo antes que a limitação comece. Na implementação de exemplo do Adaptive Performance no Megacity, usamos três maneiras diferentes de suavizar a taxa de quadros:
- Começando com níveis moderados de CPU e GPU e aumentando-os gradualmente para eliminar gargalos, conseguimos manter o consumo de energia baixo.
- Se víssemos que o dispositivo estava chegando perto da limitação, poderíamos ajustar as configurações de qualidade para reduzir a carga térmica – e decidimos diminuir os níveis de LOD .
- Também diminuímos a taxa de quadros alvo quando estávamos próximos do limite.
- Quando a taxa de quadros alvo é atingida e a temperatura está em declínio, aumentamos os níveis de LOD , aumentamos a taxa de quadros alvo e diminuímos os níveis de CPU e GPU novamente.
Esses recursos permitem que seu jogo tenha um desempenho mais suave ao longo do tempo. Ao monitorar de perto as tendências térmicas de um dispositivo, você pode ajustar as configurações de desempenho rapidamente para evitar a limitação total.
Baixe o projeto de amostra do Megacity Mobile aquipara ver como fizemos isso. Para feedback ou perguntas sobre o Megacity, visite este tópicodo fórum.
O coração do pacote é o Adaptive Performance Manager, que o Unity cria durante a inicialização, permitindo que você acesse e assine notificações de eventos térmicos e de desempenho facilmente. O exemplo abaixo mostra como acessar o Adaptive Performance Manager usando a interface IAdaptivePerformance na função Start do seu MonoBehaviour.
privado IAdaptivePerformance ap = null;
void Start()
{
ap = Titular.instância;
}
O Unity envia eventos térmicos sempre que há alterações no estado térmico do dispositivo. Os estados importantes são quando a limitação é iminente e quando a limitação está ocorrendo. No exemplo abaixo, você assina o ThermalEvents para reduzir ou aumentar seu lodBias, o que ajuda a reduzir a carga da GPU.
using UnityEngine;
using UnityEngine.Mobile.AdaptivePerformance;
classe pública AdaptiveLOD: MonoBehaviour
{
privado IAdaptivePerformance ap = null;
void Start() {
se (Holder.instance == null)
return;
ap = Titular.instância;
se (!ap.ativo)
return;
QualitySettings.lodBias = 1;
ap.ThermalEvent += OnThermalEvent;
}
void OnThermalEvent(objeto obj, ThermalEventArgs ev) {
interruptor (ev.warningLevel) {
caso PerformanceWarningLevel.NoWarning:
QualitySettings.lodBias = 1;
break;
caso PerformanceWarningLevel.ThrottlingImminent:
QualitySettings.lodBias = 0.75f;
break;
caso PerformanceWarningLevel.Throttling:
QualitySettings.lodBias = 0.5f;
break;
}
}
}
Observe que se você reduzir o lodBias abaixo de um valor de 1, isso terá um impacto visual em muitos casos e poderá ocorrer estouro de objetos LOD , mas é uma maneira fácil de reduzir a carga gráfica se não for necessária para a experiência do jogo. Caso você queira tomar decisões ainda mais detalhadas para ajustar como os gráficos e o comportamento do seu jogo são tratados, os eventos de gargalo são muito úteis.
Níveis de desempenho da CPU e GPU
A CPU e a GPU de um dispositivo móvel representam uma parte muito grande do uso de energia, especialmente ao executar um jogo. Normalmente, o sistema operacional decide quais velocidades de clock são usadas para a CPU e a GPU.
Os núcleos da CPU e as GPUs são menos eficientes quando executados em sua velocidade máxima de clock. Executar em altas velocidades de clock superaquece o dispositivo móvel facilmente e o sistema operacional limita a frequência da CPU e da GPU para resfriar o dispositivo.
Você pode evitar essa situação limitando as velocidades máximas de clock permitidas com estas propriedades:
- DesempenhoAdaptivo.NívelCPU
- DesempenhoAdaptivo.nívelGPU
O aplicativo pode configurar essas propriedades com base em seu conhecimento especial sobre os requisitos de desempenho atuais e decidir, com base no cenário, se os níveis devem ser reduzidos ou aumentados.
- O aplicativo atingiu a taxa de quadros alvo nos quadros anteriores?
- O aplicativo está em uma cena do jogo ou em um menu?
- Uma cena pesada está por vir?
- Um evento futuro exigirá muita CPU ou GPU?
- Você exibirá anúncios que não exigem altos níveis de CPU/GPU?
public void EnterMenu(){
se (!ap.ativo)
return;
// Defina o nível baixo de CPU e GPU no menu
ap.cpuLevel = 0;
ap.gpuLevel = 0;
// Definir FPS alvo baixo
Application.targetFrameRate = 15;
}
público void ExitMenu(){
// Defina um nível mais alto de CPU e GPU ao retornar ao jogo
ap.cpuLevel = ap.maxCpuPerformanceLevel;
ap.gpuLevel = ap.maxGpuPerformanceLevel;
}
No Adaptive Performance Manager, você pode assinar para receber eventos de gargalo de desempenho que informam se você está limitado à GPU, CPU ou “à taxa de quadros”. Limite de taxa de quadros significa que o jogo é limitado por Application.targetFrameRate, caso em que o aplicativo deve considerar reduzir seus requisitos de desempenho.
Em execução em segundo plano, controlando as decisões de gargalo — e consultável por meio do Gerenciador — está o driver de tempo de quadro da GPU, que monitora o tempo de hardware gasto pela GPU no último quadro; no momento, o tempo da CPU é calculado pela soma dos subsistemas internos do Unity. Dependendo do jogo e do cenário, ele pode reagir de forma diferente quando estiver vinculado à CPU ou GPU, de acordo com as mudanças de estado térmico.
void OnBottleneckChange(objeto obj, PerformanceBottleneckChangeEventArgs ev) {
interruptor (ev.gargalo) {
caso PerformanceBottleneck.TargetFrameRate:
se (ap.cpuLevel > 0) {
ap.cpuLevel--;
}
se (ap.gpuLevel > 0) {
ap.gpuLevel--;
}
break;
caso PerformanceBottleneck.GPU:
se (ap.gpuLevel < ap.maxGpuPerformanceLevel) {
ap.gpuLevel++;
}
break;
caso PerformanceBottleneck.CPU:
se (ap.cpuLevel < ap.maxCpuPerformanceLevel) {
ap.cpuLevel++;
}
break;
}
}
Há muitas maneiras diferentes de otimizar jogos, e os exemplos acima e no Megacity fornecem apenas algumas sugestões de como fazer isso; no final das contas, depende muito do que funciona melhor para o seu jogo. Para mais informações, consulte também a documentaçãodo pacote.
Isto é só o começo! Continuaremos investindo no Adaptive Performance, adicionando mais recursos e oferecendo suporte a mais dispositivos ao longo do tempo. O pacote atual inclui uma API de baixo nível, mas já estamos trabalhando em uma API de alto nível baseada em componentes compatível com DOTS, o que deve tornar ainda mais fácil adaptar o desempenho em seus projetos Unity . Fique ligado para mais informações.
Uma versão de visualização do Adaptive Performance já está disponível para o Unity 2019.1 (beta) por meio do Unity Package Manager. Você pode acessá-lo aqui. Para obter informações atualizadas sobre o Adaptive Performance, ver como outros desenvolvedores o estão usando e postar perguntas ou comentários, visite o fórum.
