Le signal VSYNC synchronise le pipeline d'affichage. Le pipeline d'affichage se compose du rendu de l'application, de la composition SurfaceFlinger et du Hardware Composer (HWC) qui présente les images à l'écran. VSYNC synchronise le moment où les applications se réveillent pour commencer le rendu, le moment où SurfaceFlinger se réveille pour composer l'écran et le cycle d'actualisation de l'écran. Cette synchronisation élimine les à-coups et améliore les performances visuelles des graphiques.
Le HWC génère des événements VSYNC et les envoie à SurfaceFlinger via le rappel:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger détermine si le HWC génère des événements VSYNC en appelant setVsyncEnabled
. SurfaceFlinger permet à setVsyncEnabled
de générer des événements VSYNC afin qu'il puisse se synchroniser avec le cycle d'actualisation de l'écran. Lorsque SurfaceFlinger est synchronisé avec le cycle d'actualisation de l'écran, il 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, il réactive la génération d'événements VSYNC.
Décalage VSYNC
L'application de synchronisation et les boucles de rendu de SurfaceFlinger sont transmises au VSYNC matériel. Lors d'un événement VSYNC, l'écran commence à afficher le frame N tandis que SurfaceFlinger commence à composer les fenêtres pour le frame N+1. L'application gère l'entrée en attente et génère le frame N+2.
La synchronisation avec VSYNC offre une latence cohérente. Il réduit les erreurs dans les applications et SurfaceFlinger, et minimise les écrans qui dérivent en phase et hors phase les uns par rapport aux autres. Cela suppose que les temps par frame de l'application et de SurfaceFlinger ne varient pas beaucoup. La latence est d'au moins deux images.
Pour y remédier, vous pouvez utiliser des décalages VSYNC pour réduire la latence d'entrée à l'affichage en faisant correspondre le signal de l'application et de la composition au VSYNC matériel. Cela est possible, car l'application et la composition prennent 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'écran commence à afficher le frame suivant.VSYNC
: l'application lit l'entrée et génère le frame suivant.SF_VSYNC
: SurfaceFlinger commence la composition pour le frame suivant.
Avec le décalage VSYNC, SurfaceFlinger reçoit le tampon et compose le frame pendant que l'application traite simultanément l'entrée et affiche le frame.
DispSync
DispSync gère un modèle des événements VSYNC périodiques basés sur le matériel d'un écran et utilise ce modèle pour exécuter des rappels à des décalages de phase spécifiques à partir des événements VSYNC matériels.
DispSync est une boucle de synchronisation de phase (PLL) logicielle 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.

Figure 1 : Flux DispSync
DispSync présente les caractéristiques suivantes:
- Référence : HW_VSYNC_0.
- Sortie : VSYNC et SF_VSYNC.
- Feedback : Suppression des codes temporels des signaux de clôture de Hardware Composer.
Décalage VSYNC/retire
Le code temporel du signal des barrières de mise à la retraite doit correspondre à VSYNC HW, 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 présentent souvent un delta où la clôture de retraite correspond à la fin de l'accès direct à la mémoire (DMA) à la mémoire d'affichage, mais le commutateur d'affichage réel et le VSYNC matériel sont un certain temps plus tard.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
est défini dans le fichier de compilation BoardConfig.mk
de l'appareil. Il est basé sur le contrôleur d'affichage et les caractéristiques du panneau. Le temps écoulé entre le code temporel de la barrière de retraite et le signal VSYNC HW 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 des cas d'utilisation à forte charge, tels que la composition partielle du GPU lors de la transition de fenêtre ou le défilement de Chrome sur une page Web contenant des animations. Ces décalages permettent de prolonger le temps de rendu de l'application et la durée de composition du GPU.
Une latence de plus d'une ou deux millisecondes est perceptible. Pour réduire la latence sans augmenter considérablement le nombre d'erreurs, intégrez des tests d'erreur automatisés approfondis.