Administración del rendimiento

Administrar la energía y el rendimiento de los dispositivos Android puede ayudar a garantizar que las apps se ejecuten de forma coherente y fluida en una amplia variedad de hardware. En Android 7.0 y versiones posteriores, los OEMs pueden implementar compatibilidad con sugerencias de rendimiento sostenido que permiten que las apps mantengan un rendimiento del dispositivo coherente y especifiquen un núcleo exclusivo para mejorar el rendimiento de las apps en primer plano que requieren mucha CPU.

Rendimiento sostenido

En el caso de las apps de larga duración (juegos, cámara, RenderScript, procesamiento de audio), el rendimiento puede variar de forma significativa a medida que se alcanzan los límites de temperatura del dispositivo y se regulan los motores del sistema en chip (SoC). Los desarrolladores de apps que crean apps de alto rendimiento y larga duración tienen limitaciones porque las capacidades de la plataforma subyacente son un objetivo en movimiento cuando el dispositivo comienza a calentarse.

Para abordar estas limitaciones, Android 7.0 introdujo la compatibilidad con el rendimiento sostenido, lo que permite a los OEMs proporcionar sugerencias sobre las capacidades de rendimiento del dispositivo para apps de larga duración. Los desarrolladores de apps pueden usar estas sugerencias para ajustar las apps y lograr un nivel de rendimiento del dispositivo predecible y coherente durante largos períodos de tiempo.

Arquitectura

Una app para Android puede solicitarle a la plataforma que ingrese a un modo de rendimiento sostenido en el que el dispositivo Android pueda mantener un nivel de rendimiento coherente durante períodos prolongados.

Figura 1: Arquitectura del modo de rendimiento sostenido

Implementación

Para admitir un rendimiento sostenido en Android 7.0 y versiones posteriores, los OEMs deben hacer lo siguiente:

  • Realiza cambios específicos del dispositivo en el HAL de energía para bloquear las frecuencias máximas de la CPU o la GPU o realizar otras optimizaciones para evitar el estrangulamiento térmico.
  • Implementa la nueva sugerencia POWER_HINT_SUSTAINED_PERFORMANCE en el HAL de energía.
  • Para declarar la compatibilidad, muestra VERDADERO a través de la API de isSustainedPerformanceModeSupported().
  • Implementa Window.setSustainedPerformanceMode.

En la implementación de referencia de Nexus, la sugerencia de energía limita las frecuencias máximas de la CPU y la GPU en los niveles más sostenibles. Ten en cuenta que bajar la barra MAX en la frecuencia de la CPU o la GPU disminuirá la velocidad de fotogramas, pero se prefiere esta velocidad más baja en este modo debido a su sostenibilidad. Por ejemplo, un dispositivo que usa relojes máximos normales puede renderizar a 60 FPS durante unos minutos, pero después de que el dispositivo se calienta, puede reducirse a 30 FPS al final de los 30 minutos. Cuando se usa el modo sostenido, el dispositivo puede, por ejemplo, renderizar de forma coherente a 45 FPS durante los 30 minutos. El objetivo es obtener una velocidad de fotogramas cuando se usa el modo que sea tan alta (o más alta) que la velocidad de fotogramas cuando no se usa el modo y que sea coherente con el tiempo para que los desarrolladores no tengan que perseguir un objetivo en movimiento.

Recomendamos implementar el modo sostenido para que el dispositivo logre el rendimiento sostenido más alto posible, no solo los valores mínimos necesarios para aprobar la prueba (p.ej., elige los límites de frecuencia MAX más altos posibles que no hagan que el dispositivo se reduzca térmicamente con el tiempo).

Nota: No es necesario limitar las velocidades de reloj MAX para implementar el modo sostenido.

Validación

Los OEMs pueden usar una prueba de CTS (Android 7.0 y versiones posteriores) para verificar su implementación de la API de rendimiento sostenido. La prueba ejecuta una carga de trabajo durante aproximadamente 30 minutos y compara el rendimiento con y sin el modo sostenido habilitado:

  • Con el modo sostenido habilitado, la velocidad de fotogramas debe permanecer relativamente constante (la prueba mide el porcentaje de cambio en la velocidad de fotogramas a lo largo del tiempo y requiere un cambio inferior al 5%).
  • Con el modo sostenido habilitado, la velocidad de fotogramas no debe ser inferior a la velocidad de fotogramas al final de 30 minutos con el modo inhabilitado.

Además, puedes probar tu implementación de forma manual con varias cargas de trabajo intensivas en la CPU y la GPU para asegurarte de que el dispositivo no se reduzca térmicamente después de 30 minutos de uso. En las pruebas internas, usamos cargas de trabajo de muestra, incluidos juegos y apps de comparativas (p.ej., gfxbench).

Núcleos exclusivos

En el caso de las cargas de trabajo urgentes y con uso intensivo de la CPU, que otro subproceso las usurpe puede marcar la diferencia entre cumplir o no con los plazos de fotogramas. En el caso de las apps que tienen requisitos estrictos de latencia y velocidad de fotogramas (como las apps de audio o realidad virtual), tener un núcleo de CPU exclusivo puede garantizar un nivel aceptable de rendimiento.

Los dispositivos que ejecutan Android 7.0 o versiones posteriores ahora pueden reservar un núcleo de forma explícita para la app en primer plano principal, lo que mejora el rendimiento de todas las apps en primer plano y les brinda a las apps con cargas de trabajo de alta intensidad más control sobre cómo se asigna su trabajo entre los núcleos de la CPU.

Para admitir un núcleo exclusivo en un dispositivo, haz lo siguiente:

  • Habilita cpusets y configura un cpuset que solo contenga la app en primer plano superior.
  • Asegúrate de que se reserve un núcleo (este es el núcleo exclusivo) para los subprocesos de este cpuset.
  • Implementa la API de getExclusiveCores para mostrar el número de núcleos del núcleo exclusivo.

Para determinar qué procesos se programan en qué núcleos, usa systrace mientras ejecutas cualquier carga de trabajo y verifica que no haya subprocesos de espacio de usuario de apps que no sean la app en primer plano superior programados en el núcleo exclusivo.

Para ver una implementación de referencia para el Nexus 6P, consulta android//device/huawei/angler/power/power.c.