Couches et écrans

Les couches et les affichages sont deux primitives qui représentent un travail de composition et des interactions avec le matériel d'affichage.

Calques

Un calque est l'unité la plus importante de la composition. Une couche est une combinaison d'une surface et d'une instance de SurfaceControl. Chaque calque possède un ensemble de propriétés qui définissent son interaction avec les autres calques. Les propriétés des calques sont décrites dans le tableau ci-dessous.

Propriété Description
Positionnelle Définit l'emplacement du calque à l'écran. Inclut des informations comme la position des bords d'un calque et son ordre Z par rapport aux autres couches (devant ou derrière d'autres couches).
Contenu Définit la façon dont le contenu affiché sur le calque doit être présenté dans les limites définies par les propriétés de position. Inclut des informations telles que le recadrage (pour développer une partie du contenu afin de remplir les limites de la couche) et la transformation (pour afficher du contenu pivoté ou inversé).
Composition Définit la manière dont la couche doit être composée avec d'autres couches. Inclut des informations telles que le mode de fusion et une valeur alpha à l'échelle de la couche pour le compositing alpha.
Optimisation Fournit des informations qui ne sont pas strictement nécessaires pour composer correctement la couche, mais qui peuvent être utilisées par l'appareil Hardware Composer (HWC) pour optimiser la composition. Inclut des informations telles que la région visible de la couche et la partie de la couche qui a été mise à jour depuis le frame précédent.

Écrans

L'écran est une autre unité importante de composition. Un système peut plusieurs écrans peuvent être ajoutés ou supprimés lors du fonctionnement normal du système. Les écrans sont ajoutée/supprimée à la demande du matériel ou à la demande du framework. L'appareil HWC demande l'ajout ou la suppression d'écrans lorsque l'écran est connecté ou déconnecté de l'appareil. le hot plug-in. Les clients demandent des écrans virtuels, dont le contenu sont affichés dans un tampon hors écran plutôt que sur un affichage physique.

Affichages virtuels

SurfaceFlinger prend en charge un écran interne (intégré au téléphone ou la tablette), des écrans externes (un téléviseur connecté via HDMI, par exemple) et un ou plusieurs écrans virtuels qui rendent la sortie composite disponible dans le système. Les écrans virtuels peuvent être utilisée pour enregistrer l'écran ou l'envoyer sur un réseau. Images générées pour un affichage virtuel sont écrites dans une BufferQueue.

Les écrans virtuels peuvent partager le même ensemble de calques que l'écran principal (la pile de calques) ou avoir leur propre ensemble. Il n'y a pas de VSYNC pour un affichage virtuel, Ainsi, le VSYNC de l'écran interne déclenche la composition pour tous s'affiche.

Sur les implémentations HWC compatibles, les écrans virtuels peuvent être composés avec OpenGL ES (GLES), HWC ou les deux. Dans les implémentations non compatibles, les affichages virtuels sont toujours composés à l'aide de GLES.

Étude de cas : screenrecord

La commande screenrecord permet à l'utilisateur enregistrez tout ce qui apparaît à l'écran sous forme de fichier .mp4 sur disque. Pour implémenter cela, le système reçoit des images composites SurfaceFlinger, les écrit dans l'encodeur vidéo, puis écrit les données des données vidéo dans un fichier. Les codecs vidéo sont gérés par un processus distinct (mediaserver), de sorte que les tampons graphiques volumineux doivent se déplacer du système d'exploitation. Pour rendre l'exercice plus difficile, l'objectif est d'enregistrer une vidéo à 60 ips haute résolution. La clé pour que cela fonctionne efficacement est BufferQueue.

La classe MediaCodec permet à une application de fournir des données sous forme d'octets bruts dans des tampons, ou à travers une surface. Lorsque screenrecord demande l'accès à une vidéo le processus mediaserver crée une BufferQueue, connecte du côté consommateur, puis renvoie le côté producteur screenrecord en tant que surface.

L'utilitaire screenrecord demande ensuite à SurfaceFlinger de créer un l'écran virtuel qui reflète l'écran principal (c'est-à-dire qu'il possède les mêmes couches), et lui demande d'envoyer la sortie vers la surface provenant mediaserver. Dans ce cas, SurfaceFlinger est le producteur de tampons que le consommateur.

Une fois la configuration terminée, screenrecord se déclenche lorsque les données encodées apparaissent. Lorsque les applications dessinent, leurs tampons se déplacent vers SurfaceFlinger, qui les compose en un seul tampon qui est envoyé directement à l'encodeur vidéo dans le processus mediaserver. Les images complètes ne sont jamais vu par le processus screenrecord. En interne, le processus mediaserver a sa propre méthode de déplacement des tampons qui transfère également des données par poignée, ce qui réduit les frais généraux.

Étude de cas : simuler des écrans secondaires

WindowManager peut demander à SurfaceFlinger de créer une couche visible SurfaceFlinger agit en tant que consommateur BufferQueue. Vous pouvez également demander à SurfaceFlinger de créer un écran virtuel, pour lequel SurfaceFlinger agit en tant que producteur de BufferQueue.

Si vous connectez un écran virtuel à une couche visible, une boucle fermée est créée, dans laquelle l'écran composite apparaît dans une fenêtre. Cette fenêtre fait désormais partie de la sortie composite. Par conséquent, lors du prochain rafraîchissement, l'image composite dans la fenêtre affiche également le contenu de la fenêtre. Pour voir cela en action, activez Options pour les développeurs dans Paramètres, sélectionnez Simulez les écrans secondaires et activez une fenêtre. Pour voir les écrans secondaires en action, utilisez screenrecord pour capturer l'activation de l'écran, puis le lire image par image.