Android 11 agrega compatibilidad con dispositivos con varias frecuencias de actualización. Esta función tiene tres componentes principales:
- Se introdujeron nuevas APIs de HAL en
android.hardware.graphics.composer@2.4
. - Código de plataforma para analizar la configuración del dispositivo para diferentes frecuencias de actualización y establecer la frecuencia de actualización deseada
- Nuevas APIs de SDK y NDK para permitir que las apps establezcan la velocidad de fotogramas deseada
Implementación
Se agregó compatibilidad exclusiva para el cambio de frecuencia de actualización a android.hardware.graphics.composer@2.4 HAL
.
Te recomendamos que uses esta versión, ya que las versiones anteriores de la HAL del compositor tienen compatibilidad limitada con el cambio de frecuencia de actualización.
Grupos de configuración
Se agregó un nuevo atributo CONFIG_GROUP
a IComposerClient::Attribute
que se puede consultar con la API de getDisplayAttribute_2_4
. Este atributo permite a los proveedores agrupar configuraciones de pantalla. Las configuraciones del mismo grupo permiten cambiar entre ellas sin problemas en la mayoría de los casos. La plataforma usa el grupo de configuración para diferenciar qué configuraciones se pueden cambiar entre sí para cambiar la frecuencia de actualización y no otros atributos de una configuración.
Considera el siguiente ejemplo, en el que se demuestran los beneficios de usar grupos de configuración con un dispositivo que admite cuatro configuraciones de pantalla:
- 1080p a 60 Hz
- 1080p a 90 Hz
- 1080i a 72 Hz
- 1080i a 48 Hz
Aunque el dispositivo admite frecuencias de actualización de 48 Hz, 60 Hz, 72 Hz y 90 Hz, la pantalla funciona en un modo diferente y cambiar de 60 Hz a 72 Hz cambia la configuración de la pantalla de 1080p a 1080i, lo que podría no ser el comportamiento deseado. Esto se resuelve con los grupos de configuración. Agrupando 60 Hz y 90 Hz en un grupo de configuración y 48 Hz y 72 Hz en otro grupo de configuración. La plataforma sabe que puede cambiar entre 60 Hz y 90 Hz y entre 48 Hz y 72 Hz, pero no entre 60 Hz y 72 Hz, ya que esto provocará un cambio de configuración en lugar de simplemente cambiar la frecuencia de actualización.
Actualizaciones de la API de Composer
- getDisplayVsyncPeriod
- Para mejorar el control y la previsibilidad cuando se cambian las frecuencias de actualización, se agregó
getDisplayVsyncPeriod
.getDisplayVsyncPeriod
muestra la frecuencia de actualización actual (en términos del período de vsync) a la que funciona la pantalla. Esto es especialmente útil cuando la plataforma necesita la transición entre la frecuencia de actualización y la actual para decidir cuándo iniciar el siguiente fotograma. - setActiveConfigWithConstraints
- El método
setActiveConfigWithConstraints
es una nueva extensión del métodosetActiveConfig
existente y proporciona más información sobre el cambio de configuración. Las restricciones se proporcionan como parte de los parámetrosvsyncPeriodChangeConstraints
y contienen los siguientes parámetros. - desiredTimeNanos
- El tiempo en
CLOCK_MONOTONIC
después del cual puede cambiar el período de vsync (es decir, el período de vsync no debe cambiar antes de este momento). Esto es útil cuando la plataforma quiere planificar con anticipación un cambio de frecuencia de actualización, pero ya tiene algunos búferes en la cola para presentar. La plataforma configura este tiempo según corresponda para tener en cuenta esos búferes y asegurarse de que la transición de la frecuencia de actualización sea lo más fluida posible. - seamlessRequired
- Si es verdadero, requiere que el cambio del período de vsync se realice sin problemas y sin artefactos visuales notables. La plataforma usa esta marca cuando se necesita un cambio en la frecuencia de actualización como resultado de un cambio de contenido (por ejemplo, el dispositivo está inactivo y se inicia la animación). Esto le brinda al proveedor la oportunidad de no permitir ciertos cambios de configuración cuando puedan generar un artefacto visual notable. Si los parámetros de configuración no se pueden cambiar sin problemas y
seamlessRequired
se establece entrue
, se espera que la implementación muestreSEAMLESS_NOT_POSSIBLE
como código de retorno y llame a la nueva devolución de llamadaonSeamlessPossible
cuando se pueda realizar el mismo cambio de configuración sin problemas. Si se ejecuta de forma correcta, la implementación muestra un
VsyncPeriodChangeTimeline
que le indica a la plataforma cuándo esperar que se produzca el cambio de frecuencia de actualización. Los parámetros denewVsyncAppliedTimeNanos
deben establecerse en la hora enCLOCK_MONOTONIC
cuando la nueva pantalla comenzará a actualizarse en el nuevo período de vsync. Esto, junto condesiredTimeNanos
, permite que la plataforma planifique con anticipación el cambio de la frecuencia de actualización y comience a marcar las apps para la nueva frecuencia de actualización con anticipación. Esto permite una transición fluida de la frecuencia de actualización.Algunas implementaciones requieren que se envíe un fotograma de actualización antes de que se pueda enviar la frecuencia de actualización. Para ello, el sistema HAL tiene el parámetro
refreshRequired
para indicar que se necesita un fotograma de actualización yrefreshTimeNanos
para indicar el primer vsync después del cual se debe enviar un fotograma de actualización.- onVsyncPeriodTimingChanged [callback]
- Es una devolución de llamada nueva a la que puede llamar el HAL para indicarle a la plataforma que cambió algún parámetro del cronograma y que la plataforma debe ajustarlo. Se espera que se llame a esta devolución de llamada si, por algún motivo, se omitió el cronograma anterior debido a un tiempo de procesamiento prolongado en el HAL o a un fotograma de actualización tardío.
¿Cómo decide la plataforma cambiar la frecuencia de actualización?
La selección de la frecuencia de actualización se realiza en los siguientes dos servicios del sistema:
- DisplayManager
DisplayManager
establece la política de alto nivel en torno a la frecuencia de actualización. Establece una configuración de pantalla predeterminada, que es la misma que la configuración de HAL de Composer. Además, establece un rango de valores mínimos y máximos para queSurfaceFlinger
elija como la frecuencia de actualización.- SurfaceFlinger
- Determina la frecuencia de actualización configurando una configuración que está en el mismo grupo de configuración que la configuración predeterminada y con una frecuencia de actualización dentro del rango mínimo/máximo.
En el Administrador de Display, se ejecutan los siguientes pasos para determinar la política:
- Encuentra el ID de configuración predeterminado mediante la consulta de la configuración activa desde
SurfaceFlinger
. - Restringir el rango de valores mínimos y máximos iterando por las condiciones del sistema
- Parámetro de configuración de la frecuencia de actualización predeterminada: El valor predeterminado de la frecuencia de actualización se establece en la superposición de configuración
R.integer.config_defaultRefreshRate
. Este valor se usa para determinar la frecuencia de actualización estándar del dispositivo para las animaciones y las interacciones táctiles. - Configuración de la frecuencia de actualización máxima: El valor de la frecuencia de actualización máxima se lee desde
Settings.System.PEAK_REFRESH_RATE
. Este valor se cambia durante el tiempo de ejecución para reflejar la configuración actual del dispositivo (por ejemplo, desde una opción del menú). El valor predeterminado se establece en la superposición de configuración deR.integer.config_defaultPeakRefreshRate
. - Configuración de la frecuencia de actualización mínima: El valor mínimo de la frecuencia de actualización se lee desde
Settings.System.MIN_REFRESH_RATE
. Este valor se puede cambiar en el entorno de ejecución para reflejar la configuración actual del dispositivo (como desde una opción de menú). El valor predeterminado es 0, por lo que no hay un valor mínimo predeterminado. - ModeId solicitado por la aplicación: Las apps pueden establecer
WindowManager.LayoutParams.preferredDisplayModeId
para reflejar una configuración preferida en la que debe funcionar la pantalla. En la mayoría de las condiciones,DisplayManager
establece el ID de configuración predeterminado según corresponda y establece las frecuencias de actualización mínima y máxima para que coincidan con la frecuencia de actualización de la configuración. - Ahorro de batería: La frecuencia de actualización se limita a 60 Hz o menos cuando el dispositivo está en modo de bajo consumo, lo que se indica a través de
Settings.Global.LOW_POWER_MODE.
.
- Parámetro de configuración de la frecuencia de actualización predeterminada: El valor predeterminado de la frecuencia de actualización se establece en la superposición de configuración
Una vez que DisplayManager
establece la política, SurfaceFlinger
establece la frecuencia de actualización en función de las capas activas (capas que ponen en cola las actualizaciones de fotogramas). Si el propietario de la capa establece una tasa de fotogramas, SurfaceFlinger intenta establecer la frecuencia de actualización en un valor que sea un multiplicador de esa tasa.
Por ejemplo, si dos capas activas establecen su velocidad de fotogramas en 24 y 60, SurfaceFlinger elegirá 120 Hz si está disponible. Si esa frecuencia de actualización no está disponible para SurfaceFlinger, intentará elegir la frecuencia de actualización que tenga el error mínimo para la velocidad de fotogramas. Para obtener más información, consulta la documentación para desarrolladores en developer.android.com.
SurfaceFlinger
mantiene las siguientes marcas para controlar cómo se decide la frecuencia de actualización:
ro.surface_flinger.use_content_detection_for_refresh_rate:
Si se establece, la frecuencia de actualización se decide en función de las capas activas, incluso si no se estableció una velocidad de fotogramas. SurfaceFlinger mantiene una heurística en la que encuentra los FPS promedio que la capa publica en los búferes mirando la marca de tiempo de presentación adjunta al búfer.ro.surface_flinger.set_touch_timer_ms
: Si es mayor que 0, se usará la frecuencia de actualización predeterminada cuando un usuario toque la pantalla durante el tiempo de espera configurado. Esta heurística se realiza para estar lista con la frecuencia de actualización predeterminada para las animaciones.ro.surface_flinger.set_idle_timer_ms
: Si es mayor que 0, se usará la frecuencia de actualización mínima cuando no haya actualizaciones de pantalla para el tiempo de espera configurado.ro.surface_flinger.set_display_power_timer_ms
: Si es mayor que 0, se usará la frecuencia de actualización predeterminada cuando se encienda la pantalla (o cuando se salga de AOD) para el tiempo de espera configurado.
API de Frame Rate
La API de velocidad de fotogramas permite que las apps informen a la plataforma de Android la velocidad de fotogramas deseada y está disponible en apps que se orientan a Android 11. Si deseas obtener más información sobre la API de velocidad de fotogramas, consulta la documentación para desarrolladores en developer.android.com.
Opciones para desarrolladores
Se agregó una nueva opción para desarrolladores al menú que activa o desactiva una superposición en la pantalla con la frecuencia de actualización actual. La nueva opción se encuentra en Configuración > Sistema > Opciones para desarrolladores > Mostrar frecuencia de actualización.