VSYNC

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.

Proces DispSync

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_NSSF_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.