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.
Pour accepter les tampons, SurfaceFlinger utilise BufferQueue. SurfaceControl. Lorsqu'une application passe au premier plan, elle demande des tampons à WindowManager WindowManager demande ensuite une couche SurfaceFlinger. Un calque est une combinaison d'une surface, qui contient la BufferQueue, et Un élément SurfaceControl, qui contient les métadonnées du calque, comme le frame d'affichage. SurfaceFlinger crée la couche et l'envoie à WindowManager. WindowManager envoie ensuite la surface à l'application, mais SurfaceControl reste manipuler l’apparence de l’application à l’écran.
Android 10 ajoute ASurfaceControl, une autre solution pour que SurfaceFlinger accepte les tampons. ASurfaceControl combine une surface et un SurfaceControl dans un package de transaction envoyé à SurfaceFlinger. Un ASurfaceControl est associé à une couche, que les applications 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 la description 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 la version précédente à une application via un rappel préenregistré. |
Bien que les applis puissent envoyer des tampons à tout moment, SurfaceFlinger ne s'active que acceptent des tampons entre les actualisations de l'écran, qui peuvent varier en fonction appareil. Cela réduit l'utilisation de la mémoire et évite une déchirure visible sur le ce qui peut se produire lors de la mise à jour de l'écran en cours d'actualisation.
Lorsque l'écran est actualisé, il envoie le code VSYNC le signal à SurfaceFlinger. Le signal VSYNC indique que l'écran peut être rafraîchie sans se déchirer. Lorsque SurfaceFlinger reçoit le signal VSYNC, SurfaceFlinger passe en revue sa liste de couches à 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 des couches visibles, il demande le 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. 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, la saisie et le focus événements, orientation de l'écran, transitions, animations, position, transformations l'ordre de plan et bien d'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 prennent pas en charge la rotation (et même si c'est le cas,
la puissance de calcul) la solution consiste à transformer le tampon avant qu'il n'atteigne
SurfaceFlinger. Android accepte un indice de requête
(NATIVE_WINDOW_TRANSFORM_HINT
) dans ANativeWindow
vers
représentent la transformation la plus susceptible d'être appliquée au tampon
SurfaceFlinger. Les pilotes GL peuvent utiliser cet indice pour prétransformer le tampon.
avant d'atteindre SurfaceFlinger. Ainsi, lorsque le tampon arrive, il est correctement
transformées.
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 enregistrer
faites cette prérotation. Pour en savoir plus, consultez les ANativeWindow
définie dans system/core/include/system/window.h
.