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