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,
getDisplayVsyncPeriodse agregó.getDisplayVsyncPeriodmuestra 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
setActiveConfigWithConstraintses una nueva extensión del métodosetActiveConfigexistente y proporciona más información sobre el cambio de configuración. Las restricciones se proporcionan como parte de losvsyncPeriodChangeConstraintsparámetros y contienen los siguientes parámetros. - desiredTimeNanos
- Es el tiempo en
CLOCK_MONOTONICdespué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
seamlessRequiredse establece entrue, se espera que la implementación muestreSEAMLESS_NOT_POSSIBLEcomo código de retorno y llame a la nueva devolución de llamadaonSeamlessPossiblecuando se pueda realizar el mismo cambio de configuración sin problemas. Si se ejecuta de forma correcta, la implementación muestra un
VsyncPeriodChangeTimelineque le indica a la plataforma cuándo esperar que se produzca el cambio de frecuencia de actualización. Los parámetrosnewVsyncAppliedTimeNanosdeben establecerse en el tiempo enCLOCK_MONOTONICcuando la nueva pantalla comience a actualizarse en el nuevo período de vsync. Esto, junto condesiredTimeNanos, 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
refreshRequiredparámetro para indicar que se necesita un fotograma de actualización yrefreshTimeNanospara 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
DisplayManagerestablece 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 queSurfaceFlingerelija 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 laR.integer.config_defaultPeakRefreshRatesuperposició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.preferredDisplayModeIdpara reflejar una configuración preferida en la que debería funcionar la pantalla. En la mayoría de las condiciones, elDisplayManagerestablece 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.
- 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
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.