VSYNC

Sygnał VSYNC synchronizuje potok wyświetlacza. Wyświetlacz Potok składa się z renderowania aplikacji, kompozycji SurfaceFlinger i Hardware Composer (HWC) prezentuje obrazy na wyświetlaczu. VSYNC synchronizuje godzina wybudzenia aplikacji przed rozpoczęciem renderowania, godzina, do której SurfaceFlinger się wybudza dokomponowania ekranu i cyklu jego odświeżania. Ta synchronizacja eliminuje zacinanie się i poprawia jakość wizualną grafiki.

HWC generuje zdarzenia VSYNC i wysyła je do SurfaceFlinger przez wywołanie zwrotne:

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 według Dzwonię pod numer setVsyncEnabled. SurfaceFlinger włącza setVsyncEnabled, aby wygenerować zdarzenia VSYNC i zsynchronizować je z cykl odświeżania wyświetlacza. Gdy SurfaceFlinger jest synchronizowana z cykl odświeżania wyświetlacza, SurfaceFlinger wyłącza setVsyncEnabled w zatrzymuje generowanie zdarzeń VSYNC. Jeśli SurfaceFlinger wykryje różnica między rzeczywistym systemem VSYNC a wcześniej ustanowionym SurfaceFlinger ponownie włącza generowanie zdarzeń VSYNC.

Przesunięcie VSYNC

Aplikacja do synchronizacji i SurfaceFlinger renderują pętle do sprzętowy VSYNC. Przy zdarzeniu VSYNC na ekranie zaczyna się wyświetlać klatka N, SurfaceFlinger rozpoczyna komponowanie okien dla ramki N+1. Aplikacja obsługuje oczekujące dane wejściowe i generują ramkę N+2.

Synchronizacja z funkcją VSYNC zapewnia stały czas oczekiwania. Zmniejsza liczbę błędów aplikacji i SurfaceFlinger, a także minimalizuje liczbę wyświetlanych ekranów i integrację społeczną. Zakładamy, że dla każdej klatki aplikacji i platformy SurfaceFlinger są powiązane z jedną ramką nie różnią się znacząco. Opóźnienie wynosi co najmniej 2 klatki.

Aby temu zaradzić, możesz zastosować przesunięcia VSYNC do zmniejszenia ilości danych wejściowych do wyświetlenia czas oczekiwania przez określenie sygnału aplikacji i kompozycji względem sprzętu VSYNC. Jest to możliwe, ponieważ aplikacja i kompozycja zajmuje zwykle ponad 33 ms.

W wyniku przesunięcia VSYNC są 3 sygnały z tym samym okresem i przesunięciem faza:

  • HW_VSYNC_0 – wyświetlacz zacznie pokazywać następną klatkę.
  • VSYNC – aplikacja odczytuje dane wejściowe i generuje kolejną klatkę.
  • SF_VSYNC – SurfaceFlinger rozpoczyna komponowanie do następnej klatki.

W przypadku przesunięcia VSYNC SurfaceFlinger odbiera bufor i komponuje a aplikacja jednocześnie przetwarza dane wejściowe i renderuje obraz. w kadrze.

DispSync

DispSync utrzymuje model okresowych, sprzętowych zdarzeń VSYNC i używa tego modelu do wykonywania wywołań zwrotnych w określonej fazie kompensacji sprzętowych zdarzeń VSYNC.

DispSync to programowa pętla blokady fazowej (PLL), która generuje Sygnały VSYNC i SF_VSYNC używane przez Choreographer i SurfaceFlinger, nawet jeśli nie przesunięcie od VSYNC sprzętowej.

Proces DispSync

Rysunek 1. Proces DispSync

Funkcja DispSync ma następujące właściwości:

  • Plik referencyjny – HW_VSYNC_0.
  • Wyjście – VSYNC i SF_VSYNC.
  • Opinie – wycofywanie sygnatur czasowych sygnałów ogrodzenia z usługi Hardware Composer.

VSYNC/wycofanie przesunięcia

Sygnatura czasowa sygnału informującego o wycofaniu płotu musi odpowiadać konfiguracji HW VSYNC, nawet w przypadku urządzeń. w których nie są używane fazy przesunięcia. W przeciwnym razie błędy mogą być poważniejsze niż jest w rzeczywistości. Panele inteligentne często mają wartość delta, na końcu której znajduje się wycofanie ogrodzenia bezpośredniego dostępu do pamięci (DMA) do wyświetlania pamięci, ale rzeczywisty przełącznik wyświetlacza a HW VSYNC pojawi się trochę później.

Ustawienie PRESENT_TIME_OFFSET_FROM_VSYNC_NS jest skonfigurowane na urządzeniu BoardConfig.mk plik Makefile. Bazuje na kontrolerze wyświetlacza i panelu dla niektórych cech produktu. Czas od sygnatury czasowej wycofania ogrodzenia do czasu konfiguracji HW VSYNC jest mierzony w nanosekundach.

Przesunięcia VSYNC i SF_VSYNC

VSYNC_EVENT_PHASE_OFFSET_NS i Parametry SF_VSYNC_EVENT_PHASE_OFFSET_NS zostały ustawione zachowawczo na podstawie: przypadki użycia związane z dużym obciążeniem, takie jak częściowa kompozycja GPU podczas przechodzenia w oknie. lub przewijanie strony internetowej z animacjami w Chrome. Te przesunięcia pozwalają na długi czas renderowania aplikacji i długi czas komponowania za pomocą GPU.

Czas oczekiwania wynosi ponad milisekundę lub dwie. Aby zminimalizować czas oczekiwania bez znacznego zwiększania liczby błędów, zintegruj pełne błędy automatyczne i testowania.