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