Gestão de Desempenho, 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 hardwares. No Android 7.0 e posterior, 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 intenso 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 limitados. 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 forneçam dicas sobre os recursos de desempenho do dispositivo para aplicativos de longa duraçã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 por longos períodos de tempo.

Arquitetura

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

Figura 1. Arquitetura do modo de desempenho sustentado

Implementação

Para oferecer suporte ao desempenho sustentado no Android 7.0 e posterior, 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 a limitação térmica.
  • 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 níveis sustentáveis ​​mais altos. Lembre-se de que diminuir a barra MAX na frequência de 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 renderizar a 60 FPS por alguns minutos, mas depois que o dispositivo aquecer, ele poderá atingir 30 FPS ao final de 30 minutos. Ao usar o modo sustentado, o dispositivo pode, por exemplo, renderizar consistentemente a 45 FPS durante todos os 30 minutos. O objetivo é uma taxa de quadros ao usar o modo que seja tão alta (ou maior) do que a taxa de quadros quando não estiver usando o modo e consistente ao longo do tempo para que os desenvolvedores não precisem perseguir um alvo em movimento.

É altamente recomendável implementar o 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 sua 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 ativado:

  • 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 várias cargas de trabalho com uso intenso de CPU e GPU para garantir que o dispositivo não estrangule termicamente após 30 minutos de uso. Em testes internos, usamos cargas de trabalho de amostra, 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 impedido por outro encadeamento pode ser a diferença entre definir prazos de quadros ou não. Para aplicativos com requisitos rígidos 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 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 nos 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 de primeiro plano superior.
  • Certifique-se de que um núcleo (este é o núcleo exclusivo) esteja reservado para encadeamentos deste cpuset .
  • Implemente a API getExclusiveCores para retornar o número do núcleo do núcleo exclusivo.

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

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