Frecuencia de actualización múltiple

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étodo setActiveConfig existente y proporciona más información sobre el cambio de configuración. Las restricciones se proporcionan como parte de los parámetros vsyncPeriodChangeConstraints 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 en true, se espera que la implementación muestre SEAMLESS_NOT_POSSIBLE como código de retorno y llame a la nueva devolución de llamada onSeamlessPossible 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 de newVsyncAppliedTimeNanos deben establecerse en la hora en CLOCK_MONOTONIC cuando la nueva pantalla comenzará a actualizarse en el nuevo período de vsync. Esto, junto con desiredTimeNanos, 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 y refreshTimeNanos 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 que SurfaceFlinger 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 de R.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..

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.