Synchronizacja pionowa

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 VSYNCSF_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:

Przebieg DispSync

Rysunek 1. Proces DispSync.

DispSync ma te cechy:

  • ReferenceHW_VSYNC_0.
  • Dane wyjściowe – VSYNCSF_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.