VSYNC

Sygnał VSYNC synchronizuje potok wyświetlania. Potok wyświetlania składa się z renderowania aplikacji, kompozycji SurfaceFlinger i narzędzia Hardware Composer (HWC) prezentującego obrazy na wyświetlaczu. VSYNC synchronizuje czas wybudzenia aplikacji w celu rozpoczęcia renderowania, czas wybudzenia SurfaceFlinger w celu złożenia ekranu oraz cykl odświeżania wyświetlacza. Ta synchronizacja eliminuje zacinanie się i poprawia wydajność wizualną grafiki.

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

typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData,
        hwc2_display_t display, int64_t timestamp);

SurfaceFlinger kontroluje, czy HWC generuje zdarzenia VSYNC, wywołując setVsyncEnabled . SurfaceFlinger umożliwia setVsyncEnabled generowanie zdarzeń VSYNC, dzięki czemu można je zsynchronizować z cyklem odświeżania wyświetlacza. Gdy SurfaceFlinger jest zsynchronizowany z cyklem odświeżania wyświetlacza, SurfaceFlinger wyłącza setVsyncEnabled , aby zatrzymać generowanie przez HWC zdarzeń VSYNC. Jeśli SurfaceFlinger wykryje różnicę między rzeczywistym VSYNC i VSYNC, wcześniej ustalony SurfaceFlinger ponownie włącza generowanie zdarzeń VSYNC.

Przesunięcie VSYNC

Aplikacja do synchronizacji i pętle renderujące SurfaceFlinger do sprzętowego VSYNC. W przypadku zdarzenia VSYNC wyświetlacz zaczyna pokazywać klatkę N , podczas gdy SurfaceFlinger rozpoczyna komponowanie okien dla klatki N+1 . Aplikacja obsługuje oczekujące dane wejściowe i generuje ramkę N+2 .

Synchronizacja z VSYNC zapewnia stałe opóźnienia. Redukuje błędy w aplikacjach i SurfaceFlingerze oraz minimalizuje wzajemne przesuwanie się wyświetlaczy w fazie. Zakłada się, że czasy na klatkę aplikacji i SurfaceFlingera nie różnią się znacznie. Opóźnienie wynosi co najmniej dwie klatki.

Aby temu zaradzić, można zastosować przesunięcia VSYNC, aby zmniejszyć opóźnienie sygnału wejściowego na ekran, tworząc sygnał aplikacji i kompozycji względem sprzętowego VSYNC. Jest to możliwe, ponieważ aplikacja i kompozycja zwykle zajmują mniej niż 33 ms.

Wynikiem przesunięcia VSYNC są trzy sygnały o tym samym okresie i fazie przesunięcia:

  • HW_VSYNC_0 — Wyświetlacz zaczyna pokazywać następną klatkę.
  • VSYNC — aplikacja odczytuje dane wejściowe i generuje następną klatkę.
  • SF_VSYNC — SurfaceFlinger rozpoczyna komponowanie następnej klatki.

Dzięki przesunięciu VSYNC SurfaceFlinger odbiera bufor i składa ramkę, podczas gdy aplikacja jednocześnie przetwarza dane wejściowe i renderuje ramkę.

DispSync

DispSync utrzymuje model okresowych, sprzętowych zdarzeń VSYNC wyświetlacza i wykorzystuje ten model do wykonywania wywołań zwrotnych przy określonych przesunięciach fazowych w stosunku do sprzętowych zdarzeń VSYNC.

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ą przesunięte względem sprzętowego VSYNC.

Przepływ DispSync

Rysunek 1. Przebieg DispSync

DispSync ma następujące cechy:

  • Odniesienie — HW_VSYNC_0.
  • Wyjście — VSYNC i SF_VSYNC.
  • Opinia — Wycofaj znaczniki czasu sygnału ogrodzenia z narzędzia Hardware Composer.

Przesunięcie VSYNC/wycofanie

Znacznik czasu sygnału wycofanych ogrodzeń musi być zgodny z HW VSYNC, nawet w przypadku urządzeń, które nie korzystają z fazy przesunięcia. W przeciwnym razie błędy wydają się poważniejsze niż w rzeczywistości. Inteligentne panele często mają deltę, w której ograniczeniem jest koniec bezpośredniego dostępu do pamięci (DMA) w celu wyświetlenia pamięci, ale faktyczne przełączenie wyświetlacza i HW VSYNC następuje jakiś czas później.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS jest ustawiony w pliku Makefile BoardConfig.mk urządzenia. Opiera się na kontrolerze wyświetlacza i charakterystyce panelu. Czas od znacznika czasu ogrodzenia wycofania do sygnału HW VSYNC mierzony jest w nanosekundach.

Przesunięcia VSYNC i SF_VSYNC

VSYNC_EVENT_PHASE_OFFSET_NS i SF_VSYNC_EVENT_PHASE_OFFSET_NS są ustawiane konserwatywnie w oparciu o przypadki użycia o dużym obciążeniu, takie jak częściowy układ GPU podczas przejścia okna lub przewijanie strony internetowej zawierającej animacje w przeglądarce Chrome. Te przesunięcia pozwalają na długi czas renderowania aplikacji i długi czas kompozycji procesora graficznego.

Zauważalne jest opóźnienie przekraczające milisekundę lub dwie. Aby zminimalizować opóźnienia bez znaczącego zwiększania liczby błędów, należy zintegrować dokładne zautomatyzowane testowanie błędów.