Сигнал VSYNC синхронизирует конвейер отображения. Конвейер отображения состоит из рендеринга приложения, композиции SurfaceFlinger и аппаратного компоновщика (HWC), представляющего изображения на дисплее. VSYNC синхронизирует время пробуждения приложений для начала рендеринга, время пробуждения SurfaceFlinger для компоновки экрана и цикл обновления дисплея. Эта синхронизация устраняет заикание и улучшает визуальную производительность графики.
HWC генерирует события VSYNC и отправляет их в SurfaceFlinger через обратный вызов:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger контролирует, генерирует ли HWC события VSYNC, вызывая setVsyncEnabled
. SurfaceFlinger позволяет setVsyncEnabled
генерировать события VSYNC, чтобы он мог синхронизироваться с циклом обновления дисплея. Когда SurfaceFlinger синхронизируется с циклом обновления дисплея, SurfaceFlinger отключает setVsyncEnabled
, чтобы HWC не генерировал события VSYNC. Если SurfaceFlinger обнаруживает разницу между фактическим VSYNC и VSYNC, установленным ранее, SurfaceFlinger повторно включает генерацию событий VSYNC.
Смещение VSYNC
Приложение синхронизации и рендеринг SurfaceFlinger зацикливаются на аппаратном VSYNC. При событии VSYNC дисплей начинает отображать кадр N , а SurfaceFlinger начинает компоновку окон для кадра N+1 . Приложение обрабатывает ожидающий ввод и генерирует кадр N+2 .
Синхронизация с VSYNC обеспечивает постоянную задержку. Это уменьшает количество ошибок в приложениях и SurfaceFlinger, а также сводит к минимуму дрейф дисплеев в фазе друг друга. Это предполагает, что время приложения и SurfaceFlinger для каждого кадра не сильно различается. Задержка составляет не менее двух кадров.
Чтобы исправить это, вы можете использовать смещения VSYNC, чтобы уменьшить задержку ввода-вывода, сделав сигнал приложения и композиции относительно аппаратного VSYNC. Это возможно, потому что приложение плюс композиция обычно занимает менее 33 мс.
Результатом смещения VSYNC являются три сигнала с одинаковым периодом и смещением фазы:
-
HW_VSYNC_0
— Дисплей начинает показывать следующий кадр. -
VSYNC
— приложение считывает ввод и генерирует следующий кадр. -
SF_VSYNC
— SurfaceFlinger начинает композитинг для следующего кадра.
При смещении VSYNC SurfaceFlinger получает буфер и компонует кадр, в то время как приложение одновременно обрабатывает ввод и визуализирует кадр.
Диспсинк
DispSync поддерживает модель периодических аппаратных событий VSYNC дисплея и использует эту модель для выполнения обратных вызовов при определенных сдвигах фазы от аппаратных событий VSYNC.
DispSync — это программный контур фазовой синхронизации (PLL), который генерирует сигналы VSYNC и SF_VSYNC, используемые Choreographer и SurfaceFlinger, даже если они не смещены от аппаратного VSYNC.
![Поток DispSync](https://source.android.com/static/devices/graphics/images/dispsync.png?authuser=19&hl=ru)
Рисунок 1. Поток DispSync
DispSync обладает следующими качествами:
- Ссылка — HW_VSYNC_0.
- Выход — VSYNC и SF_VSYNC.
- Обратная связь — удаление временных меток сигнала ограждения из Hardware Composer.
VSYNC/смещение смещения
Временная метка сигнала удаленных барьеров должна соответствовать HW VSYNC даже на устройствах, которые не используют смещение фазы. В противном случае ошибки кажутся более серьезными, чем они есть на самом деле. Интеллектуальные панели часто имеют дельту, где отступающая граница является концом прямого доступа к памяти (DMA) для отображения памяти, но фактическое переключение дисплея и HW VSYNC происходит некоторое время спустя.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
устанавливается в make- BoardConfig.mk
устройства. Он основан на характеристиках контроллера дисплея и панели. Время от метки времени удаления до сигнала HW VSYNC измеряется в наносекундах.
Смещения VSYNC и SF_VSYNC
VSYNC_EVENT_PHASE_OFFSET_NS
и SF_VSYNC_EVENT_PHASE_OFFSET_NS
устанавливаются консервативно на основе вариантов использования с высокой нагрузкой, таких как частичная композиция графического процессора во время перехода между окнами или прокрутка Chrome веб-страницы, содержащей анимацию. Эти смещения учитывают длительное время рендеринга приложения и длительное время композиции графического процессора.
Заметна задержка более миллисекунды или двух. Чтобы свести к минимуму задержку без значительного увеличения количества ошибок, интегрируйте тщательное автоматическое тестирование ошибок.