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 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 del SDK y el NDK para permitir que las apps establezcan la velocidad de fotogramas deseada
Implementación
Se agregó compatibilidad específica con el cambio de frecuencia de actualización a android.hardware.graphics.composer@2.4 HAL
.
Te recomendamos usar esta versión, ya que las versiones anteriores del HAL de Composer 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 que los proveedores agrupen las configuraciones de visualización. 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 las configuraciones que se pueden alternar 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 la pantalla de 1080p a 1080i, lo que podría no ser el comportamiento deseado. Esto se resuelve con el uso de 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 generaría un cambio de configuración en lugar de simplemente cambiar la frecuencia de actualización.


Actualizaciones de la API de Composer
- getDisplayVsyncPeriod
- Se agregó
getDisplayVsyncPeriod
para mejorar el control y la previsibilidad al cambiar las frecuencias de actualización.getDisplayVsyncPeriod
devuelve la frecuencia de actualización actual (en términos de período de VSync) a la que funciona la pantalla. Esto es especialmente útil durante la transición entre la frecuencia de actualización y la frecuencia de actualización actual que necesita la plataforma 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ámetros devsyncPeriodChangeConstraints
y contienen los siguientes parámetros. - desiredTimeNanos
- Es la hora en
CLOCK_MONOTONIC
después de la cual puede cambiar el período de sincronización vertical (es decir, el período de sincronización vertical no debe cambiar antes de esta hora). Esto es útil cuando la plataforma quiere planificar con anticipación un cambio en la frecuencia de actualización, pero ya tiene algunos búferes en la cola para presentar. La plataforma establece este tiempo de forma adecuada 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 sincronización vertical se produzca sin problemas, 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 comienza la animación). Esto le brinda al proveedor la oportunidad de no permitir ciertos cambios de configuración cuando estos 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 devuelvaSEAMLESS_NOT_POSSIBLE
como código de devolución 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 se realiza correctamente, se devuelve un objeto
VsyncPeriodChangeTimeline
que le indica a la plataforma cuándo se espera que se produzca el cambio en la frecuencia de actualización. Los parámetros denewVsyncAppliedTimeNanos
deben establecerse en el momento deCLOCK_MONOTONIC
en el que la pantalla nueva comenzará a actualizarse en el nuevo período de sincronización vertical. 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, el HAL tiene el parámetro
refreshRequired
para indicar que se necesita un fotograma de actualización yrefreshTimeNanos
para indicar la primera sincronización vertical en la que se debe enviar un fotograma de actualización después.- onVsyncPeriodTimingChanged [devolución de llamada]
- Es una nueva devolución de llamada que el 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 omitió la línea de tiempo anterior debido a un tiempo de procesamiento prolongado en la 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 del HAL del compositor. Además, establece un rango de valores mínimos y máximos para queSurfaceFlinger
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 o máximo.
El Administrador de pantalla sigue los siguientes pasos para determinar la política:
- Busca el ID de configuración predeterminado consultando la configuración activa desde
SurfaceFlinger
. - Restringir el rango de valores mínimos y máximos iterando sobre las condiciones del sistema
- Parámetro de configuración de frecuencia de actualización predeterminado: El valor de frecuencia de actualización predeterminado se establece en la superposición de configuración de
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. - Parámetro de configuración de frecuencia de actualización más alta: El valor de la frecuencia de actualización más alta se lee de
Settings.System.PEAK_REFRESH_RATE
. Este valor se 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 superposición de configuraciónR.integer.config_defaultPeakRefreshRate
. - Configuración de frecuencia de actualización mínima: El valor de frecuencia de actualización mínima se lee desde
Settings.System.MIN_REFRESH_RATE
. Este valor se puede cambiar en el tiempo de ejecución para reflejar el parámetro de 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 operar la pantalla. En la mayoría de las condiciones,DisplayManager
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 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 con
Settings.Global.LOW_POWER_MODE.
.
- Parámetro de configuración de frecuencia de actualización predeterminado: El valor de frecuencia de actualización predeterminado se establece en la superposición de configuración de
Una vez que DisplayManager
establece la política, SurfaceFlinger
establece la frecuencia de actualización según 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 un valor que sea un múltiplo de esa velocidad.
Por ejemplo, si dos capas activas establecen su frecuencia de fotogramas en 24 y 60, SurfaceFlinger elegirá 120 Hz si está disponible. Si SurfaceFlinger no puede usar esa frecuencia de actualización, intentará elegir la que tenga el error mínimo para la frecuencia 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 frecuencia de fotogramas. SurfaceFlinger mantiene una heurística en la que encuentra el promedio de FPS con el que la capa publica 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 tener lista la frecuencia de actualización predeterminada para las 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 del modo 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 sobre la velocidad de fotogramas deseada y está disponible en las apps que se segmentan para Android 11. Para obtener más información sobre la API de Frame Rate, 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.