Sygnał VSync synchronizuje potok wyświetlania. Proces wyświetlania obejmuje renderowanie aplikacji, kompozycję SurfaceFlinger i wyświetlanie obrazów na ekranie przez Hardware Composer (HWC). VSync synchronizuje czas, w którym aplikacje zaczynają renderowanie, czas, w którym SurfaceFlinger zaczyna łączyć ekran, oraz cykl odświeżania wyświetlacza. Ta synchronizacja eliminuje zacinanie się i poprawia wydajność grafiki.
HWC generuje zdarzenia VSync i wysyła je do SurfaceFlinger 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 generuje zdarzenia VSync, wywołując funkcję setVsyncEnabled
. SurfaceFlinger umożliwia generowanie zdarzeń VSync, dzięki czemu może synchronizować się z cyklem odświeżania wyświetlacza.setVsyncEnabled
Gdy usługa SurfaceFlinger jest zsynchronizowana z cyklem odświeżania wyświetlacza, wyłącza setVsyncEnabled
, aby zatrzymać generowanie zdarzeń VSync przez HWC. Jeśli SurfaceFlinger wykryje różnicę między rzeczywistym sygnałem VSync a sygnałem VSync, który został wcześniej ustalony, ponownie włączy generowanie zdarzeń VSync.
Przesunięcia synchronizacji pionowej
Aplikacja synchronizująca i usługa SurfaceFlinger renderują pętle do synchronizacji pionowej sprzętu. Podczas zdarzenia VSync wyświetlacz zaczyna wyświetlać klatkę N, a SurfaceFlinger zaczyna łączyć okna dla klatki N+1. Aplikacja przetwarza oczekujące dane wejściowe i generuje klatkę N+2.
Synchronizacja z VSync zapewnia stałe opóźnienie. Zmniejsza liczbę błędów w aplikacjach i usłudze SurfaceFlinger oraz minimalizuje rozbieżności w fazie wyświetlania. Zakładamy, że czasy poszczególnych klatek aplikacji i usługi SurfaceFlinger nie różnią się zbytnio. Opóźnienie wynosi co najmniej 2 klatki.
Aby temu zapobiec, możesz użyć przesunięć VSync, aby zmniejszyć opóźnienie od wejścia do wyświetlania, dostosowując sygnał aplikacji i kompozycji do sprzętowego VSync. Jest to możliwe, ponieważ kompozycja aplikacji plus trwa zwykle mniej niż 33 ms.
Wynikiem przesunięcia VSync są 3 sygnały o tym samym okresie i przesunięciu fazowym:
HW_VSYNC_0
– wyświetlacz zaczyna wyświetlać następną klatkę.VSYNC
– aplikacja odczytuje dane wejściowe i generuje następną klatkę.SF_VSYNC
– usługa SurfaceFlinger rozpoczyna komponowanie następnej klatki.
Dzięki przesunięciom VSync SurfaceFlinger otrzymuje bufor i komponuje klatkę, a aplikacja jednocześnie przetwarza dane wejściowe i renderuje klatkę.
DispSync
DispSync utrzymuje model okresowych zdarzeń VSync opartych na sprzęcie wyświetlacza i używa go do wykonywania wywołań zwrotnych z określonymi przesunięciami fazowymi względem zdarzeń VSync sprzętu.
DispSync to programowa pętla synchronizacji fazowej (PLL), która generuje sygnały VSYNC
i SF_VSYNC
używane przez Choreographer i SurfaceFlinger, nawet jeśli nie są one przesunięte względem sprzętowej synchronizacji pionowej.
Przepływ DispSync jest przedstawiony na tym rysunku:

Rysunek 1. Proces DispSync.
DispSync ma te cechy:
- Reference –
HW_VSYNC_0
. - Dane wyjściowe –
VSYNC
iSF_VSYNC
. - Feedback – usuwanie sygnatur czasowych sygnałów ogrodzenia z HWC.
Przesunięcia wycofania synchronizacji pionowej
Sygnatura czasowa sygnału wycofania musi być zgodna z synchronizacją pionową sprzętu, nawet na urządzeniach, które nie używają fazy przesunięcia. W przeciwnym razie błędy będą wydawać się poważniejsze, niż są w rzeczywistości. Inteligentne panele często mają różnicę, w której bariera wycofania jest końcem bezpośredniego dostępu do pamięci (DMA) do pamięci wyświetlacza, ale rzeczywiste przełączenie wyświetlacza i synchronizacja pionowa sprzętu następuje jakiś czas później.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
jest ustawiony w pliku makefile urządzenia BoardConfig.mk
. Zależy to od kontrolera wyświetlacza i charakterystyki panelu. Czas od sygnatury czasowej bariery wycofania do sygnału HW VSync jest mierzony w nanosekundach.
Przesunięcia VSYNC i SF_VSYNC
VSYNC_EVENT_PHASE_OFFSET_NS
i
SF_VSYNC_EVENT_PHASE_OFFSET_NS
są ustawione w sposób konserwatywny na podstawie przypadków użycia przy dużym obciążeniu, takich jak częściowa kompozycja GPU podczas przejścia okna lub przewijanie strony internetowej zawierającej animacje w Chrome. Te przesunięcia
umożliwiają długi czas renderowania aplikacji i długi czas komponowania przez GPU.
Opóźnienie powyżej 1–2 milisekund jest zauważalne. Aby zminimalizować opóźnienia bez znacznego zwiększania liczby błędów, przeprowadź dokładne automatyczne testy błędów.