A partir del 27 de marzo de 2025, te recomendamos que uses android-latest-release
en lugar de aosp-main
para compilar y contribuir a AOSP. Para obtener más información, consulta Cambios en AOSP.
Administración de búfer de fotogramas del cliente
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
A partir de Android 13, los búferes de fotogramas nuevos, que se usan durante la composición del cliente, se asignan cada vez que cambia la resolución de pantalla. SurfaceFlinger realiza esta asignación en el siguiente ciclo de invalidación después de un cambio de resolución.
Administración del búfer de fotogramas durante los cambios de resolución
Los cambios de resolución se producen debido a una de las siguientes situaciones:
Un evento de conexión y desconexión, que inicia el compositor de hardware (HWC), que se produce cuando se cambia de una pantalla externa a otra que tiene una resolución predeterminada diferente.
Durante un evento de hotplug, se liberan los controladores de los framebuffers anteriores cuando se deallocan los datos de visualización anteriores.
Un interruptor de modo de visualización iniciado por SurfaceFlinger, que ocurre cuando el usuario cambia la resolución con la configuración del usuario o cuando una app cambia la resolución con preferredDisplayModeId
.
Durante un cambio de modo de visualización, SurfaceFlinger libera los controladores de los búferes de tramas de clientes existentes antes de llamar a setActiveConfig
o setActiveConfigWithConstraints
.
Para evitar problemas catastróficos, como la fragmentación de la memoria, en dispositivos que no reservan suficiente memoria para los búferes de trama nuevos y antiguos, es fundamental que HWC deje de usar los búferes de trama antiguos y libere cualquier control de estos búferes, como se muestra en los siguientes casos:
Liberar los controladores permite que la memoria del búfer de trama se desasigne por completo antes de la asignación de búferes de trama nuevos que realiza SurfaceFlinger durante el siguiente ciclo de invalidación.
Recomendaciones para la administración del búfer de fotogramas
Si HWC no libera los controladores de los framebuffers anteriores a tiempo, la asignación del framebuffer nuevo se realiza antes de la desasignación del framebuffer anterior. Esto puede causar problemas catastróficos cuando la nueva asignación falla debido a la fragmentación o a otros problemas. Peor aún, si HWC no libera estos controladores, se puede producir una fuga de memoria.
Para evitar fallas catastróficas de asignación, sigue estas recomendaciones:
Si HWC necesita seguir usando los framebuffers de cliente anteriores hasta que se proporcionen los nuevos, es fundamental reservar suficiente memoria para los framebuffers anteriores y nuevos, y posiblemente ejecutar algoritmos de desfragmentación en el espacio de memoria del framebuffer.
Asigna un conjunto de memoria dedicado para los framebuffers que esté separado del resto de la memoria del búfer gráfico. Esto es importante porque, entre la desasignación y la reasignación de los búferes de trama, un proceso de terceros puede intentar asignar memoria gráfica. Si el framebuffer usa el mismo grupo de memoria gráfica y la memoria gráfica está llena, el proceso de terceros puede ocupar la memoria gráfica que asignó un framebuffer anteriormente, lo que deja memoria insuficiente para la reasignación del framebuffer o, posiblemente, fragmenta el espacio de memoria.
Prueba la administración de búfer de fotogramas
Se recomienda a los OEMs que prueben la administración correcta de la memoria del búfer de tramas del cliente en todos los interruptores de resolución de su dispositivo, como se describe a continuación:
Para los eventos de conexión en caliente, simplemente desconecta y vuelve a conectar dos pantallas diferentes con resoluciones diferentes.
Para los cambios de modo, usa la prueba del verificador de CTS ModeSwitchingTestActivity
para iniciar un cambio de modo y probar el comportamiento de la memoria del búfer de tramas.
Esta prueba puede identificar visualmente problemas que son difíciles de detectar
de manera programática.
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-07-27 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-07-27 (UTC)"],[],[],null,["# Client framebuffer management\n\nStarting with Android 13, new framebuffers, used during\n[client](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/DisplayCommand.aidl#113)\ncomposition, are allocated whenever the display resolution changes. This\nallocation is performed by SurfaceFlinger on the next *invalidate* cycle\nafter a resolution change.\n\nFramebuffer management during resolution switches\n-------------------------------------------------\n\nResolution changes occur due to one of the following\ntwo scenarios:\n\n- A [hotplug event](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerCallback.aidl#41),\n initiated by Hardware Composer (HWC), which occurs when swapping from one external\n display to a different external display that has a different default resolution.\n\n During a hotplug event, the handles to the old framebuffers are released\n when the old display data is deallocated.\n- A display mode switch initiated by SurfaceFlinger, which occurs when the\n user changes the resolution with [user settings](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android16-release/core/java/android/hardware/display/DisplayManager.java#1209),\n or an app changes the resolution with [`preferredDisplayModeId`](https://developer.android.com/reference/android/view/WindowManager.LayoutParams#preferredDisplayModeId).\n\n During a display mode switch, the handles to existing client framebuffers\n are released by SurfaceFlinger before calling [`setActiveConfig`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#550)\n or [`setActiveConfigWithConstraints`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#577).\n\nTo avoid catastrophic problems, such as memory fragmentation, on devices that\ndon't reserve enough memory for the old and new framebuffers, it's critical\nthat HWC ceases to use the old framebuffers and releases any\nhandles to these framebuffers as shown in the following cases:\n\n- For hotplug events, immediately before calling [`onHotplug`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerCallback.aidl#41).\n\n- For mode switches, immediately after the call to [`setActiveConfig`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#550)\n or [`setActiveConfigWithConstraints`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/graphics/composer/aidl/android/hardware/graphics/composer3/IComposerClient.aidl#577).\n\nReleasing the handles allows the framebuffer memory to be fully deallocated\nprior to the allocation of new framebuffers that SurfaceFlinger performs\nduring the next *invalidate* cycle.\n\n### Recommendations for framebuffer management\n\nIf HWC doesn't release handles to old framebuffers in time,\nthe new framebuffer allocation takes place before the old framebuffer\ndeallocation. This can cause catastrophic problems when the new allocation fails\ndue to fragmentation or other issues. Even worse, if\nHWC doesn't release these handles at all, a memory leak can\noccur.\n\nTo avoid catastrophic allocation failures, follow these recommendations:\n\n- If HWC needs to continue using the old client framebuffers until the new\n client framebuffers are provided, then it's critical to reserve enough memory\n for both the old and new framebuffers, and possibly run defragmentation\n algorithms on the framebuffer memory space.\n\n- Allocate a dedicated memory pool for the framebuffers that's separate from\n the rest of the graphic buffer memory. This is important because between\n deallocation and reallocation of the framebuffers, a third-party process can\n attempt to allocate graphics memory. If the same graphics memory pool is\n used by the framebuffer and if the graphics memory is full, the third-party\n process can occupy the graphics memory previously allocated by a framebuffer,\n thus leaving insufficient memory for the framebuffer reallocation or, possibly\n fragmenting the memory space.\n\nTest framebuffer management\n---------------------------\n\nOEMs are advised to test for proper client framebuffer memory management across\nresolution switches for their device, described as follows:\n\n- For hotplug events, simply unplug and reconnect two different displays with\n different resolutions.\n\n- For mode switches, use the [`ModeSwitchingTestActivity`](https://cs.android.com/android/platform/superproject/+/android-latest-release:cts/apps/CtsVerifier/src/com/android/cts/verifier/tv/display/ModeSwitchingTestActivity.java;l=47-53;drc=c80d948aff1e7df5c2dc0ddba0d1cd63a90e4d9c) CTS\n Verifier test to initiate a mode switch for testing framebuffer memory behavior.\n This test can visually identify problems that are hard to detect\n programmatically."]]