Sygnał VSYNC synchronizuje potok wyświetlania. Rury przetwarzania wyświetlacza obejmują renderowanie aplikacji, kompozycję SurfaceFlingera i komponent sprzętowy Hardware Composer (HWC), który wyświetla obrazy na ekranie. VSYNC synchronizuje czas, w którym aplikacje się budzą, aby rozpocząć renderowanie, czas, w którym SurfaceFlinger się budzi, aby zobrazować ekran, oraz cykl odświeżania wyświetlacza. Ta synchronizacja eliminuje zacinanie i poprawia jakość grafiki.
HWC generuje zdarzenia VSYNC i wysyła je do SurfaceFlingera za pomocą wywołania zwrotnego:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger określa, czy HWC ma generować zdarzenia VSYNC, wywołując funkcję setVsyncEnabled
. SurfaceFlinger umożliwia generowanie zdarzeń VSYNC przez setVsyncEnabled
, aby można było zsynchronizować je z cyklem odświeżania wyświetlacza. Gdy SurfaceFlinger jest zsynchronizowany z cyklem odświeżania wyświetlacza, wyłącza setVsyncEnabled
, aby zapobiec generowaniu zdarzeń VSYNC przez HWC. Jeśli SurfaceFlinger wykryje różnicę między rzeczywistą synchronizacją pionową a synchronizacją ustaloną wcześniej, ponownie włączy generowanie zdarzenia synchronizacji pionowej.
przesunięcie synchronizacji pionowej,
Aplikacja synchronizująca i renderowanie SurfaceFlingera pętli do sprzętowego VSYNC. Podczas zdarzenia VSYNC wyświetlacz zaczyna wyświetlać klatkę N, a SurfaceFlinger rozpoczyna łączenie okien w przypadku klatki N+1. Aplikacja obsługuje oczekujące dane wejściowe i generuje klatka N+2.
Synchronizacja z VSYNC zapewnia stały czas oczekiwania. Zmniejsza liczbę błędów w aplikacjach i w programie SurfaceFlinger oraz minimalizuje zjawisko przesuwania się wyświetlaczy względem siebie. Zakładamy, że czasy generowania klatek aplikacji i SurfaceFlinger nie różnią się znacząco. Opóźnienie wynosi co najmniej 2 klatki.
Aby to naprawić, możesz użyć przesunięć VSYNC, aby zmniejszyć opóźnienie od wejścia do wyświetlacza, przez dostosowanie sygnału aplikacji i kompozycji do sygnału VSYNC sprzętowego. Jest to możliwe, ponieważ aplikacja plus kompozycja zwykle zajmują mniej niż 33 ms.
Wynik przesunięcia VSYNC to 3 sygnały o tym samym okresie i tym samym przesunięciu fazy:
HW_VSYNC_0
– wyświetlacz zaczyna wyświetlać następną klatkę.VSYNC
– aplikacja odczytuje dane wejściowe i wygeneruje następną klatkę.SF_VSYNC
– SurfaceFlinger rozpoczyna kompozycję na potrzeby następnej klatki.
W przypadku przesunięcia VSYNC aplikacja SurfaceFlinger otrzymuje bufor i zgrywa klatkę, a aplikacja jednocześnie przetwarza dane wejściowe i renderuje klatkę.
DispSync
DispSync utrzymuje model okresowych zdarzeń VSYNC na wyświetlaczu opartych na sprzęcie i wykorzystuje ten model do wykonywania wywołań zwrotnych w określonych fazach przesunięcia od zdarzeń VSYNC na sprzęcie.
DispSync to oprogramowanie PLL, które generuje sygnały VSYNC i SF_VSYNC używane przez Choreographer i SurfaceFlinger, nawet jeśli nie są przesunięte względem sprzętowego sygnału VSYNC.

Rysunek 1. Proces DispSync
DispSync ma te cechy:
- Referencyjny – HW_VSYNC_0.
- Wyjście – VSYNC i SF_VSYNC.
- Opinia – usuń sygnaturę czasową sygnału ogrodzenia z komponenta sprzętowego.
VSYNC/retire offset
Znak czasu sygnału dla ograniczeń wycofywania musi być zgodny z synchronizacją pionową sprzętową, nawet na urządzeniach, które nie używają fazy przesunięcia. W przeciwnym razie błędy mogą wydawać się poważniejsze, niż są w rzeczywistości. Inteligentne panele często mają deltę, w której element fence jest końcem bezpośredniego dostępu do pamięci (DMA) do pamięci wyświetlacza, ale faktyczne przełączanie wyświetlacza i synchronizacja pionowa sprzętowa następuje po pewnym czasie.
Wartość PRESENT_TIME_OFFSET_FROM_VSYNC_NS
jest ustawiona w pliku make BoardConfig.mk
urządzenia. który jest oparty na kontrolerze wyświetlacza i charakterystyce panelu. Czas od sygnatury czasowej wycofania ogrodzenia do sygnału VSYNC sprzętu jest mierzony w nanosekundach.
przesunięcia VSYNC i SF_VSYNC,
Wartości VSYNC_EVENT_PHASE_OFFSET_NS
i SF_VSYNC_EVENT_PHASE_OFFSET_NS
są ustawiane konserwatywnie na podstawie przypadków użycia o wysokim obciążeniu, takich jak częściowe renderowanie przez GPU podczas przełączania okien lub przewijanie w Chrome strony internetowej zawierającej animacje. Te przesunięcia kompensacyjne umożliwiają długi czas renderowania aplikacji i długi czas komponowania przez GPU.
Opóźnienie większe niż 1 ms jest zauważalne. Aby zminimalizować opóźnienia bez znacznego zwiększania liczby błędów, zintegruj dokładne testy automatyczne błędów.