Gestão de Desempenho

Gerenciar a potência e o desempenho dos dispositivos Android pode ajudar a garantir que os aplicativos sejam executados de forma consistente e suave em uma ampla variedade de hardware. No Android 7.0 e versões posteriores, os OEMs podem implementar suporte para dicas de desempenho sustentado que permitem que os aplicativos mantenham um desempenho consistente do dispositivo e especifiquem um núcleo exclusivo para melhorar o desempenho de aplicativos em primeiro plano com uso intensivo de CPU.

Desempenho sustentado

Para aplicativos 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 no chip (SoC) são acelerados. Os desenvolvedores de aplicativos que criam aplicativos de alto desempenho e longa duração são limitados porque os recursos da plataforma subjacente são um alvo móvel quando o dispositivo começa a esquentar.

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

Arquitetura

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

Figura 1. Arquitetura de modo de desempenho sustentado

Implementação

Para oferecer suporte ao desempenho sustentado no Android 7.0 e versões posteriores, os OEMs devem:

  • Faça alterações específicas do dispositivo no HAL de energia para bloquear as frequências máximas de CPU/GPU ou realizar outras otimizações para evitar o afogamento térmico.
  • Implemente a nova dica POWER_HINT_SUSTAINED_PERFORMANCE no power HAL.
  • Declare suporte retornando TRUE por meio da 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 GPU nos mais altos níveis sustentáveis. Lembre-se de que diminuir a barra MAX na frequência da CPU/GPU diminuirá a taxa de quadros, mas essa taxa mais baixa é preferida neste modo devido à sua sustentabilidade. Por exemplo, um dispositivo que usa clocks máximos normais pode ser capaz de renderizar a 60 FPS por alguns minutos, mas depois que o dispositivo aquece, ele pode acelerar para 30 FPS ao final de 30 minutos. Ao usar o modo sustentado, o dispositivo pode, por exemplo, renderizar consistentemente a 45 FPS durante 30 minutos inteiros. O objetivo é uma taxa de quadros ao usar o modo que seja tão alta (ou superior) quanto a taxa de quadros quando não estiver usando o modo, e consistente ao longo do tempo para que os desenvolvedores não tenham que perseguir um alvo em movimento.

Recomendamos fortemente a implementação do modo sustentado para que o dispositivo atinja o desempenho sustentado mais alto possível - não apenas os valores mínimos necessários para passar no teste (por exemplo, escolha os limites de frequência MAX mais altos possíveis que não façam com que o dispositivo acelere termicamente ao longo do tempo).

Nota : Não é necessário limitar as taxas de clock MAX para implementar o modo sustentado.

Validação

Os OEMs podem usar um teste CTS (Android 7.0 e posterior) para verificar a implementação da API de desempenho sustentado. O teste executa uma carga de trabalho por aproximadamente 30 minutos e compara o desempenho com e sem o modo sustentado habilitado:

  • Com o modo sustentado ativado, a taxa de quadros deve permanecer relativamente constante (o teste mede a porcentagem de alteração na taxa de quadros ao longo do tempo e requer uma alteração <5%).
  • Com o modo sustentado ativado, a taxa de quadros não deve ser inferior à taxa de quadros ao final de 30 minutos com o modo desativado.

Além disso, você pode testar manualmente sua implementação com diversas cargas de trabalho com uso intensivo de CPU e GPU para garantir que o dispositivo não seja acelerado termicamente após 30 minutos de uso. Em testes internos, usamos amostras de cargas de trabalho, incluindo jogos e aplicativos de benchmarking (por exemplo, gfxbench ).

Núcleos exclusivos

Para cargas de trabalho com uso intensivo de CPU e sensíveis ao tempo, ser interrompido por outro thread pode ser a diferença entre cumprir prazos de quadros ou não. Para aplicativos que possuem requisitos rigorosos de latência e taxa de quadros (como aplicativos de áudio ou realidade virtual), ter um núcleo de CPU exclusivo pode garantir um nível aceitável de desempenho.

Os dispositivos que executam o Android 7.0 ou posterior agora podem reservar um núcleo explicitamente para o aplicativo principal em primeiro plano, melhorando o desempenho de todos os aplicativos em primeiro plano e dando aos aplicativos com cargas de trabalho de alta intensidade mais controle sobre como seu trabalho é alocado entre os núcleos da CPU.

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

  • Habilite cpusets e configure um cpuset que contenha apenas o aplicativo principal em primeiro plano.
  • Certifique-se de que um núcleo (este é o núcleo exclusivo) esteja reservado para threads deste cpuset .
  • Implemente a API getExclusiveCores para retornar o número do núcleo exclusivo.

Para determinar quais processos estão agendados em quais núcleos, use systrace ao executar qualquer carga de trabalho e verifique se nenhum encadeamento do espaço do usuário de aplicativos diferentes do aplicativo de primeiro plano superior está agendado no núcleo exclusivo.

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