Gerenciamento de desempenho

Gerenciar a energia e o desempenho de dispositivos Android pode ajudar a garantir que os apps sejam executados de maneira consistente e tranquila em uma ampla variedade de hardware. No Android 7.0 e mais recentes, os OEMs podem implementar suporte a dicas de desempenho sustentado que permitem que os apps mantenham um desempenho consistente do dispositivo e especifiquem um núcleo exclusivo para melhorar o desempenho de apps em primeiro plano com uso intensivo de CPU.

Performance sustentável

Para apps de longa duração (jogos, câmera, RenderScript, processamento de áudio), o desempenho pode variar drasticamente à medida que os limites de temperatura do dispositivo são atingidos e os mecanismos do sistema em chip (SoC) são limitados. Os desenvolvedores de apps que criam apps de alto desempenho e de longa duração são limitados porque os recursos da plataforma subjacente são um alvo em movimento quando o dispositivo começa a esquentar.

Para resolver essas limitações, o Android 7.0 introduziu suporte a desempenho sustentado, permitindo que os OEMs forneçam dicas sobre recursos de desempenho do dispositivo para apps de longa duração. Os desenvolvedores de apps podem usar essas dicas para ajustar os apps a um nível previsível e consistente de desempenho do dispositivo por longos períodos.

Arquitetura

Um app Android pode solicitar que a plataforma entre em um modo de desempenho sustentado, em que o dispositivo Android pode manter um nível consistente de desempenho por períodos prolongados.

Figura 1. Arquitetura do modo performance sustentada.

Implementação

Para oferecer suporte a desempenho sustentável no Android 7.0 e versões mais recentes, os OEMs precisam:

  • Faça mudanças específicas do dispositivo no HAL de energia para bloquear as frequências máximas da CPU/GPU ou realize outras otimizações para evitar a limitação térmica.
  • Implementar o novo hint POWER_HINT_SUSTAINED_PERFORMANCE no HAL de energia.
  • Declare suporte retornando "TRUE" pela API isSustainedPerformanceModeSupported().
  • Implemente Window.setSustainedPerformanceMode.

Na implementação de referência do Nexus, a dica de energia limita as frequências máximas da CPU e da GPU nos níveis mais altos sustentáveis. Lembre-se de que diminuir a barra MAX na frequência da CPU/GPU vai diminuir a taxa de frames, mas essa taxa mais baixa é a preferida nesse modo devido à sustentabilidade. Por exemplo, um dispositivo que usa clocks máximos normais pode renderizar a 60 FPS por alguns minutos, mas, depois que ele esquenta, pode ser limitado a 30 FPS ao final de 30 minutos. Ao usar o modo sustentado, o dispositivo pode, por exemplo, renderizar de forma consistente a 45 QPS durante os 30 minutos. O objetivo é uma taxa de frames ao usar o modo que seja tão alta (ou mais alta) do que a taxa de frames quando não se usa o modo e consistente ao longo do tempo para que os desenvolvedores não precisem perseguir um alvo em movimento.

Recomendamos implementar o modo sustentado para que o dispositivo alcance o melhor desempenho sustentado possível, não apenas os valores mínimos necessários para passar no teste. Por exemplo, escolha os limites de frequência MÁXIMA mais altos que não causem o limite térmico do dispositivo ao longo do tempo.

Observação: não é necessário limitar as taxas de clock MÁX. para implementar o modo sustentado.

Validação

Os OEMs podem usar um teste do CTS (Android 7.0 e versões mais recentes) para verificar a implementação da API Sustained Performance. O teste executa uma carga de trabalho por aproximadamente 30 minutos e compara a performance com e sem o modo sustentado ativado:

  • Com o modo sustentado ativado, a taxa de frames precisa permanecer relativamente constante. O teste mede a porcentagem de mudança na taxa de frames ao longo do tempo e exige uma mudança de menos de 5%.
  • Com o modo sustentado ativado, a taxa de frames não pode ser menor que a taxa de frames no final de 30 minutos com o modo desativado.

Além disso, é possível testar manualmente a implementação com várias cargas de trabalho de intensidade de CPU e GPU para garantir que o dispositivo não seja limitado termicamente após 30 minutos de uso. Nos testes internos, usamos cargas de trabalho de exemplo, incluindo jogos e apps de comparação (por exemplo, gfxbench).

Cores exclusivas

Para cargas de trabalho com uso intensivo de CPU e que dependem do tempo, ser interrompido por outra linha de execução pode ser a diferença entre cumprir ou não os prazos de frame. Para apps com requisitos rígidos de latência e taxa de frames, como apps de áudio ou realidade virtual, ter um núcleo de CPU exclusivo pode garantir um nível aceitável de desempenho.

Os dispositivos com o Android 7.0 ou versões mais recentes agora podem reservar um núcleo explicitamente para o app em primeiro plano, melhorando o desempenho de todos os apps em primeiro plano e dando aos apps com cargas de trabalho de alta intensidade mais controle sobre como o trabalho é alocado entre os núcleos da CPU.

Para oferecer suporte a um núcleo exclusivo em um dispositivo:

  • Ative cpusets e configure um cpuset que contenha apenas o app em primeiro plano.
  • Verifique se um núcleo (o exclusivo) está reservado para linhas de execução desta cpuset.
  • Implemente a API getExclusiveCores para retornar o número do núcleo exclusivo.

Para determinar quais processos são programados em quais núcleos, use systrace ao executar qualquer carga de trabalho e verifique se nenhuma linha de execução do espaço do usuário de apps diferentes do app em primeiro plano está programada no núcleo exclusivo.

Para conferir uma implementação de referência do Nexus 6P, consulte android//device/huawei/angler/power/power.c.