SurfaceFlinger accepte les tampons, les compose et les envoie à l'écran. WindowManager fournit à SurfaceFlinger des tampons et des métadonnées de fenêtre, que SurfaceFlinger utilise pour composer des surfaces à l'écran.
SurfaceFlinger
SurfaceFlinger peut accepter des tampons de deux manières: via BufferQueue et SurfaceControl, ou via ASurfaceControl.
L'une des façons dont SurfaceFlinger accepte les tampons est via BufferQueue et SurfaceControl. Lorsqu'une application passe au premier plan, elle demande des tampons à WindowManager. WindowManager demande ensuite une couche à SurfaceFlinger. Une couche est une combinaison d'une surface, qui contient le BufferQueue, et d'un SurfaceControl, qui contient les métadonnées de la couche, comme le frame d'affichage. SurfaceFlinger crée la couche et l'envoie à WindowManager. WindowManager envoie ensuite la surface à l'application, mais conserve SurfaceControl pour manipuler l'apparence de l'application à l'écran.
Android 10 ajoute ASurfaceControl, qui est un autre moyen pour SurfaceFlinger d'accepter des tampons. ASurfaceControl combine une surface et un SurfaceControl dans un package de transaction envoyé à SurfaceFlinger. Un ASurfaceControl est associé à une couche, que les applications mettent à jour via ASurfaceTransactions. Les applications obtiennent ensuite des informations sur les ASurfaceTransactions via des rappels qui transmettent des informations ASurfaceTransactionStats, telles que le délai de verrouillage, les délais d'acquisition, etc.
Le tableau suivant fournit plus d'informations sur ASurfaceControl et ses composants associés.
Component | Description |
---|---|
ASurfaceControl | Encapsule SurfaceControl et permet à une application de créer des SurfaceControls correspondant aux calques à l'écran. Peut être créé en tant qu'enfant d'ANativeWindow ou d'un autre ASurfaceControl. |
ASurfaceTransaction | Encapsule 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 le temps de verrouillage, les temps d'acquisition et la clôture de version précédente, à une application via un rappel préenregistré. |
Bien que les applications puissent envoyer des tampons à tout moment, SurfaceFlinger ne se réveille que pour accepter les tampons entre les actualisations d'écran, ce qui peut varier selon l'appareil. Cela réduit l'utilisation de la mémoire et évite les déchirures visibles à l'écran, qui peuvent se produire lors de la mise à jour de l'écran en cours d'actualisation.
Lorsque l'écran est entre deux actualisations, il envoie le signal VSYNC à SurfaceFlinger. Le signal VSYNC indique que l'écran peut être actualisé sans déchirure. Lorsque SurfaceFlinger reçoit le signal VSYNC, il parcourt sa liste de calques à la recherche de nouveaux tampons. Si SurfaceFlinger trouve un nouveau tampon, il l'acquiert. Sinon, il continue à utiliser le tampon précédemment acquis. SurfaceFlinger doit toujours afficher quelque chose. Il s'accroche donc à un tampon. Si aucun tampon n'a jamais été envoyé sur un calque, celui-ci est ignoré.
Une fois que SurfaceFlinger a collecté tous les tampons pour les calques visibles, il demande au compositeur matériel (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. SurfaceFlinger transmet ensuite le tampon de sortie au HWC.
WindowManager
WindowManager contrôle les objets fenêtre, qui sont des conteneurs pour les objets vue. Les objets de fenêtre sont toujours associés à 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 fenêtre à SurfaceFlinger afin que SurfaceFlinger puisse utiliser ces données pour composer des surfaces à l'écran.
Prérotation
De nombreuses superpositions matérielles ne sont pas compatibles avec la rotation (et même si elles le sont, cela coûte de la puissance de traitement). La solution consiste à 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 probable à appliquer au tampon par SurfaceFlinger. Les pilotes GL peuvent utiliser cette indication pour pré-transformer le tampon avant qu'il n'atteigne SurfaceFlinger afin que, lorsqu'il arrive, il soit correctement transformé.
Par exemple, lorsque vous recevez un indice pour effectuer une rotation de 90 degrés, générez et appliquez une matrice au tampon pour l'empêcher de s'exécuter en dehors de la fin de la page. Pour économiser de l'énergie, effectuez cette pré-rotation. Pour en savoir plus, consultez l'interface ANativeWindow
définie dans system/core/include/system/window.h
.