SurfaceFlinger et WindowManager

SurfaceFlinger accepte les tampons, compose des tampons et envoie des tampons à l'affichage. WindowManager fournit à SurfaceFlinger des tampons et des métadonnées de fenêtre, que SurfaceFlinger utilise pour composer des surfaces à l'affichage.

SurfaceFlinger

SurfaceFlinger peut accepter les tampons de deux manières: via BufferQueue et SurfaceControl, ou via ASurfaceControl.

Une façon dont SurfaceFlinger accepte les tampons est via BufferQueue et SurfaceControl. Lorsqu'une application arrive au premier plan, elle demande des tampons à WindowManager . WindowManager demande ensuite un calque à SurfaceFlinger. Un calque est une combinaison d'une surface , qui contient le BufferQueue, et d'unSurfaceControl , qui contient les métadonnées du calque comme le cadre d'affichage. SurfaceFlinger crée le calque et l'envoie à WindowManager. WindowManager envoie ensuite la surface à l'application, mais conserve le SurfaceControl pour manipuler l'apparence de l'application à l'écran.

Android 10 ajoute ASurfaceControl, qui est une autre façon dont SurfaceFlinger peut accepter les tampons. ASurfaceControl combine une surface et un SurfaceControl en un seul package de transaction qui est envoyé à SurfaceFlinger. Un ASurfaceControl est associé à une couche, que les applications mettent à jour via ASurfaceTransactions. Les applications obtiennent ensuite des informations sur ASurfaceTransactions via des rappels qui transmettent ASurfaceTransactionStats contenant des informations, telles que l'heure de verrouillage, les heures d'acquisition, etc.

Le tableau suivant contient plus de détails sur ASurfaceControl et ses composants associés.

Composant La description
ASurfaceControl Enveloppe SurfaceControl et permet à une application de créer des SurfaceControls qui correspondent aux couches sur l'écran.

Peut être créé en tant qu'enfant d'ANativeWindow ou en tant qu'enfant d'un autre ASurfaceControl.
ASurfaceTransaction Enveloppe la transaction pour permettre au client de modifier les propriétés descriptives d'une couche, telles que la géométrie, et envoie les tampons mis à jour à SurfaceFlinger.
ASurfaceTransactionStats Envoie des informations sur les transactions qui ont été présentées, telles que l'heure de verrouillage, les heures d'acquisition et la clôture de la version précédente, à une application via un rappel préenregistré.

Bien que les applications puissent soumettre des tampons à tout moment, SurfaceFlinger ne se réveille que pour accepter les tampons entre les actualisations de l'affichage, qui peuvent différer en fonction de l'appareil. Cela minimise l'utilisation de la mémoire et évite les déchirures visibles sur l'écran, qui peuvent se produire lors de la mise à jour de l'affichage en cours de rafraîchissement.

Lorsque l'affichage est entre les rafraîchissements, l'affichage envoie le signal VSYNC à SurfaceFlinger. Le signal VSYNC indique que l'affichage peut être rafraîchi sans se déchirer. Lorsque SurfaceFlinger reçoit le signal VSYNC, SurfaceFlinger parcourt sa liste de couches à la recherche de nouveaux tampons. Si SurfaceFlinger trouve un nouveau tampon, SurfaceFlinger acquiert le tampon; sinon, SurfaceFlinger continue d'utiliser le tampon précédemment acquis. SurfaceFlinger doit toujours afficher quelque chose, il se bloque donc sur un tampon. Si aucun tampon n'a jamais été soumis sur un calque, le calque est ignoré.

Une fois que SurfaceFlinger a collecté tous les tampons pour les couches visibles, il demande au Hardware Composer (HWC) comment la composition doit être effectuée. Si le HWC marque le type de composition de calque comme composition client, SurfaceFlinger compose ces calques. Ensuite, SurfaceFlinger transmet le tampon de sortie au HWC .

WindowManager

WindowManager contrôle les objets de fenêtre , qui sont des conteneurs pour les objets de vue . Les objets de fenêtre sont toujours soutenus par des objets de surface. WindowManager supervise les cycles de vie, les événements d'entrée et de mise au point, l'orientation de l'écran, les transitions, les animations, la position, les transformations, l'ordre z et de nombreux autres aspects d'une fenêtre. WindowManager envoie toutes les métadonnées de la fenêtre à SurfaceFlinger afin que SurfaceFlinger puisse utiliser ces données pour composer des surfaces sur l'affichage.

Pré-rotation

De nombreuses superpositions matérielles ne prennent pas en charge la rotation (et même si elles le font, cela coûte de la puissance de traitement); la solution est de transformer le tampon avant qu'il n'atteigne SurfaceFlinger. Android prend en charge un indice de requête ( NATIVE_WINDOW_TRANSFORM_HINT ) dans ANativeWindow pour représenter la transformation la plus susceptible d'être appliquée au tampon par SurfaceFlinger. Les pilotes GL peuvent utiliser cette astuce pour pré-transformer le tampon avant qu'il n'atteigne SurfaceFlinger afin que lorsque le tampon arrive, il soit correctement transformé.

Par exemple, lorsque vous recevez un conseil pour faire pivoter de 90 degrés, générez et appliquez une matrice au tampon pour l'empêcher de sortir de la fin de la page. Pour économiser de l'énergie, effectuez cette pré-rotation. Pour plus de détails, consultez l'interface ANativeWindow définie dans system/core/include/system/window.h .