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:

  • Nuevas APIs de HAL introducidas en android.hardware.graphics.composer@2.4.
  • Código de la 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 …Recomendamos usar esta versión porque las versiones anteriores de HAL de Composer tienen compatibilidad limitada para el cambio de frecuencia de actualización.

Grupos de configuración

Se agregó un atributo nuevo, CONFIG_GROUP, a IComposerClient::Attribute que se puede consultar con la API de getDisplayAttribute_2_4. Este atributo permite que los proveedores agrupen las configuraciones de pantalla. Las configuraciones en el 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 entre qué configuraciones se puede cambiar para cambiar la frecuencia de actualización y no otros atributos de una configuración.

Considera el siguiente ejemplo que demuestra 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 pantalla de 1080p a 1080i, lo que podría no ser el comportamiento deseado. Los grupos de configuración resuelven este problema. Al agrupar 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 genera un cambio de configuración en lugar de simplemente cambiar la frecuencia de actualización.

Actualizaciones de la API de Composer

getDisplayVsyncPeriod
Para un mejor control y previsibilidad cuando se cambian las frecuencias de actualización, getDisplayVsyncPeriod se agregó. getDisplayVsyncPeriod muestra la frecuencia de actualización actual (en términos de período de vsync) en la que funciona la pantalla. Esto es especialmente útil durante la transición entre la frecuencia de actualización, y la plataforma necesita la frecuencia de actualización 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 vsyncPeriodChangeConstraints parámetros y contienen los siguientes parámetros.
    desiredTimeNanos
    Es 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 tiempo). 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 establece este tiempo en consecuencia 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 de período de vsync se produzca sin problemas sin un artefacto visual notable. La plataforma usa esta marca cuando se necesita un cambio de 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 da al proveedor la oportunidad de no permitir ciertos cambios de configuración cuando podrían generar un artefacto visual notable. Si las configuraciones 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 newVsyncAppliedTimeNanos deben establecerse en el tiempo en CLOCK_MONOTONIC cuando la nueva pantalla comience a actualizarse en el nuevo período de vsync. Esto, junto con desiredTimeNanos, permite que la plataforma planifique con anticipación el cambio de 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, HAL tiene el refreshRequired parámetro para indicar que se necesita un fotograma de actualización y refreshTimeNanos para indicar el primer vsync en el que se debe enviar un fotograma de actualización después.

onVsyncPeriodTimingChanged [devolución de llamada]
Es una nueva devolución de llamada que HAL puede llamar para indicarle a la plataforma que cambió algún parámetro de la línea de tiempo y que la plataforma debe ajustar su línea de tiempo. Se espera que se llame a esta devolución de llamada si, por algún motivo, se perdió la línea de tiempo anterior debido a un tiempo de procesamiento prolongado en 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
El 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 frecuencia de actualización.
SurfaceFlinger
Determina la frecuencia de actualización estableciendo una configuración que se encuentra 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.

El administrador de pantallas ejecuta los siguientes pasos para determinar la política:

  • Busca el ID de configuración predeterminado consultando la configuración activa de SurfaceFlinger
  • Restringe el rango de valores mínimos y máximos iterando sobre las condiciones del sistema
    • Configuración de frecuencia de actualización predeterminada: El valor de frecuencia de actualización predeterminado 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 frecuencia de actualización máxima: El valor de frecuencia de actualización máxima se lee de Settings.System.PEAK_REFRESH_RATE. Este valor cambia en el tiempo de ejecución para reflejar la configuración actual del dispositivo (por ejemplo, desde una opción de menú). El valor predeterminado se establece en la R.integer.config_defaultPeakRefreshRate superposición de configuración.
    • Configuración de frecuencia de actualización mínima: El valor de frecuencia de actualización mínima se lee de Settings.System.MIN_REFRESH_RATE. Este valor se puede cambiar en el tiempo de ejecución para reflejar la configuración actual del dispositivo (por ejemplo, desde una opción de menú ). El valor predeterminado es 0, por lo que no hay un 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 debería funcionar la pantalla. En la mayoría de las condiciones, el DisplayManager establece el ID de configuración predeterminado en consecuencia y establece la frecuencia de actualización mínima y máxima para que coincida con la frecuencia de actualización de la configuración.
    • Ahorro de batería: La frecuencia de actualización se restringe 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 velocidad de fotogramas, SurfaceFlinger intenta establecer la frecuencia de actualización en algo que sea un multiplicador de esa velocidad. Por ejemplo, si dos capas activas establecen su velocidad de fotogramas en 24 y 60, SurfaceFlinger elegirá 120 Hz si está disponible. Si SurfaceFlinger no tiene disponible esa frecuencia de actualización, 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 el promedio de FPS que la capa publica en búferes observando la marca de tiempo de presentación adjunta al búfer.
  • ro.surface_flinger.set_touch_timer_ms: Si es > 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 animaciones.
  • ro.surface_flinger.set_idle_timer_ms: Si es > 0, se usará la frecuencia de actualización mínima cuando no haya actualizaciones de pantalla durante el tiempo de espera configurado.
  • ro.surface_flinger.set_display_power_timer_ms: Si es > 0, se usará la frecuencia de actualización predeterminada cuando se encienda la pantalla (o cuando se salga de AOD) durante el tiempo de espera configurado.

API de velocidad de fotogramas

La API de velocidad de fotogramas permite que las apps informen a la plataforma de Android sobre la velocidad de fotogramas deseada y está disponible en las apps orientadas a Android 11. Para 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 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.