VSYNC

Le signal VSYNC synchronise le pipeline d'affichage. Le pipeline d'affichage comprend le rendu de l'application, la composition SurfaceFlinger et le Hardware Composer (HWC) présentant des images à l'écran. VSYNC synchronise l'heure à laquelle les applications se réveillent pour commencer le rendu, l'heure à laquelle SurfaceFlinger se réveille pour composer l'écran et le cycle de rafraîchissement de l'affichage. Cette synchronisation élimine le bégaiement et améliore les performances visuelles des graphiques.

Le HWC génère des événements VSYNC et envoie les événements à SurfaceFlinger via le rappel :

typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData,
        hwc2_display_t display, int64_t timestamp);

SurfaceFlinger contrôle si le HWC génère ou non des événements VSYNC en appelant setVsyncEnabled . SurfaceFlinger permet à setVsyncEnabled de générer des événements VSYNC afin de pouvoir se synchroniser avec le cycle de rafraîchissement de l'écran. Lorsque SurfaceFlinger est synchronisé avec le cycle d'actualisation de l'affichage, SurfaceFlinger désactive setVsyncEnabled pour empêcher le HWC de générer des événements VSYNC. Si SurfaceFlinger détecte une différence entre le VSYNC réel et le VSYNC qu'il a précédemment établi, SurfaceFlinger réactive la génération d'événements VSYNC.

Décalage VSYNC

L'application de synchronisation et SurfaceFlinger restituent des boucles sur le matériel VSYNC. Lors d'un événement VSYNC, l'écran commence à afficher l'image N tandis que SurfaceFlinger commence à composer des fenêtres pour l'image N+1 . L'application gère les entrées en attente et génère le cadre N+2 .

La synchronisation avec VSYNC offre une latence constante. Il réduit les erreurs dans les applications et SurfaceFlinger et minimise les affichages déphasés les uns par rapport aux autres. Cela suppose que les temps par image de l'application et de SurfaceFlinger ne varient pas considérablement. La latence est d'au moins deux images.

Pour remédier à ce problème, vous pouvez utiliser des décalages VSYNC pour réduire la latence entre l'entrée et l'affichage en créant un signal d'application et de composition par rapport au VSYNC matériel. Cela est possible car la composition de l'application et de la composition prend généralement moins de 33 ms.

Le résultat du décalage VSYNC est trois signaux avec la même période et la même phase de décalage :

  • HW_VSYNC_0 — L'affichage commence à afficher l'image suivante.
  • VSYNC — L'application lit l'entrée et génère l'image suivante.
  • SF_VSYNC — SurfaceFlinger commence la composition pour l'image suivante.

Avec le décalage VSYNC, SurfaceFlinger reçoit le tampon et compose l'image tandis que l'application traite simultanément l'entrée et restitue l'image.

DispSync

DispSync maintient un modèle des événements VSYNC matériels périodiques d'un écran et utilise ce modèle pour exécuter des rappels à des décalages de phase spécifiques par rapport aux événements VSYNC matériels.

DispSync est une boucle logicielle à verrouillage de phase (PLL) qui génère les signaux VSYNC et SF_VSYNC utilisés par Choreographer et SurfaceFlinger, même s'ils ne sont pas décalés par rapport au VSYNC matériel.

Flux DispSync

Figure 1. Flux DispSync

DispSync possède les qualités suivantes :

  • Référence — HW_VSYNC_0.
  • Sortie — VSYNC et SF_VSYNC.
  • Commentaires — Supprimez les horodatages des signaux de clôture de Hardware Composer.

VSYNC/décalage de retrait

L'horodatage du signal des clôtures de retrait doit correspondre à HW VSYNC, même sur les appareils qui n'utilisent pas la phase de décalage. Sinon, les erreurs semblent plus graves qu’elles ne le sont. Les panneaux intelligents ont souvent un delta où la clôture de retrait marque la fin de l'accès direct à la mémoire (DMA) pour afficher la mémoire, mais le commutateur d'affichage réel et HW VSYNC se produit quelque temps plus tard.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS est défini dans le fichier makefile BoardConfig.mk de l'appareil. Il est basé sur les caractéristiques du contrôleur d’affichage et du panneau. Le temps écoulé entre l’horodatage de la clôture de retrait et le signal HW VSYNC est mesuré en nanosecondes.

Décalages VSYNC et SF_VSYNC

VSYNC_EVENT_PHASE_OFFSET_NS et SF_VSYNC_EVENT_PHASE_OFFSET_NS sont définis de manière conservatrice en fonction de cas d'utilisation à forte charge, tels que la composition partielle du GPU pendant la transition de fenêtre ou le défilement de Chrome dans une page Web contenant des animations. Ces décalages permettent un temps de rendu d'application long et un temps de composition GPU long.

Plus d’une milliseconde ou deux de latence sont perceptibles. Pour minimiser la latence sans augmenter considérablement le nombre d’erreurs, intégrez des tests d’erreurs automatisés approfondis.