Android 11 agrega compatibilidad con dispositivos con varias frecuencias de actualización. Esta función tiene tres componentes principales:
- Se introdujeron las nuevas APIs de HAL en
android.hardware.graphics.composer@2.4
- Código de la plataforma para analizar la configuración de los dispositivos en función de distintas frecuencias de actualización y configura 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 dedicada para el cambio de frecuencia de actualización a android.hardware.graphics.composer@2.4 HAL
.
Recomendamos usar esta versión, ya que las versiones anteriores
La HAL del compositor tiene compatibilidad limitada con el cambio de la frecuencia de actualización.
Grupos de configuración
Se agregó un atributo nuevo CONFIG_GROUP
a
IComposerClient::Attribute
que se puede consultar mediante
API de getDisplayAttribute_2_4
. Este atributo permite que los proveedores
configuraciones de visualización. 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 que demuestra los beneficios de usar config grupos con un dispositivo que admite cuatro configuraciones de pantalla:
- 1080p a 60 Hz
- 1080 p a 90 Hz
- 1080i a 72 Hz
- 1080i a 48 Hz
Aunque el dispositivo admita frecuencias de actualización de 48 Hz, 60 Hz, 72 Hz y 90 Hz, el funciona en un modo diferente y cambiar de 60 Hz a 72 Hz cambia la configuración de visualización de 1080p a 1080i, 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 de 60 Hz y 72 Hz, ya que esto dará como resultado 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 predictibilidad al cambiar las frecuencias de actualización
Se agregó
getDisplayVsyncPeriod
.getDisplayVsyncPeriod
muestra la frecuencia de actualización actual (en términos de vsync), funciona la pantalla. Esto es especialmente útil mientras la transición entre la frecuencia de actualización y la actual es necesaria plataforma para decidir cuándo iniciar el siguiente fotograma. - setActiveConfigWithConstraints
- El método
setActiveConfigWithConstraints
es una extensión nueva al métodosetActiveConfig
existente y proporciona más información sobre el cambio de configuración. Las restricciones se proporcionan como parte del ParámetrosvsyncPeriodChangeConstraints
y contienen lo siguiente parámetros. - deseadoTimeNanos
- Es la hora en
CLOCK_MONOTONIC
después de la cual puede cambiar el período de vsync (es decir, el período de vsync no debe cambiar antes de esta hora). 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. - sin interrupciones
- 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 un
El cambio en la frecuencia de actualización es necesario como resultado de un cambio de contenido (por ejemplo, el
está inactivo y comienza 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 las configuraciones no se pueden cambiar sin problemas y
seamlessRequired
se establece entrue
, se espera que la implementación muestreSEAMLESS_NOT_POSSIBLE
como el 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 la implementación es exitosa, devolverá
VsyncPeriodChangeTimeline
, que le indica a la plataforma cuándo esperar el cambio en la frecuencia de actualización. Los parámetrosnewVsyncAppliedTimeNanos
deben establecerse en el momento deCLOCK_MONOTONIC
en el que la pantalla nueva 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 la actualización y la tasa de cambio. Para eso, la HAL tiene el elemento
refreshRequired
para indicar que se necesita un fotograma de actualizaciónrefreshTimeNanos
para indicar el primer vsync en el que se actualizó un fotograma debe enviarse después.- onVsyncPeriodTimingChanged [devolución de llamada]
- Es una nueva devolución de llamada que la HAL puede realizar para indicar a la plataforma que algunos parámetro del cronograma cambió y la plataforma debe ajustar su cronograma. Se espera que se llame a esta devolución de llamada si, por algún motivo, se se perdió debido a un tiempo de procesamiento prolongado en la HAL o a una actualización tardía marco.
¿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:
- Administrador de Display
- El
DisplayManager
establece la política de alto nivel en torno a la frecuencia de actualización. Establece una configuración de visualización predeterminada, que es lo mismo que la configuración de la HAL del compositor. 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 estableciendo una configuración que está en la misma configuración. como la configuración predeterminada y con una frecuencia de actualización dentro del rango del rango de destino de la ruta.
El Administrador de pantallas realiza los siguientes pasos para determinar la política:
- Encuentra el ID de configuración predeterminado consultando la configuración activa desde
SurfaceFlinger
- Restringir el rango de valores mínimos y máximos iterando por las condiciones del sistema
- Configuración predeterminada de la frecuencia de actualización: Es 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: Es el valor de la frecuencia de actualización máxima.
se lee desde
Settings.System.PEAK_REFRESH_RATE
. Este valor se cambia en el entorno de ejecución para reflejar la configuración actual del dispositivo (como desde una opción de 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 situacionesDisplayManager
establece el ID de configuración predeterminado según corresponda y establece la frecuencia de actualización mínima y máxima para que coincida con los frecuencia de actualización. - Ahorro de batería: La frecuencia de actualización se limita a 60 Hz.
menos cuando el dispositivo esté en el modo de bajo consumo, que se indica mediante
Settings.Global.LOW_POWER_MODE.
- Configuración predeterminada de la frecuencia de actualización: Es el valor predeterminado de la frecuencia de actualización.
se establece en la superposición de configuración
Una vez que DisplayManager
establezca la política,
SurfaceFlinger
establece la frecuencia de actualización en función de las capas activas (capas que se ponen en cola).
las actualizaciones de marcos). 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 dicha frecuencia de actualización no está disponible para
SurfaceFlinger, intentará elegir la frecuencia de actualización que tenga
en 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 en
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 > 0, el valor predeterminado se usará cuando un usuario toque la pantalla para la configuración tiempo de espera. Se realiza esta heurística para preparar la frecuencia de actualización predeterminada de animaciones.ro.surface_flinger.set_idle_timer_ms
: si > 0, frecuencia de actualización mín. se usará 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 del AOD) durante 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 el velocidad de fotogramas y está disponible en apps Android 11 Para obtener más información 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.