Сигнал 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 управляет генерацией событий VSync аппаратным контроллером (HWC) с помощью вызова setVsyncEnabled
. SurfaceFlinger включает setVsyncEnabled
для генерации событий VSync, чтобы синхронизироваться с циклом обновления дисплея. Когда SurfaceFlinger синхронизирован с циклом обновления дисплея, SurfaceFlinger отключает setVsyncEnabled
, чтобы предотвратить генерацию событий VSync аппаратным контроллером (HWC). Если SurfaceFlinger обнаруживает разницу между фактическим значением VSync и ранее установленным значением VSync, SurfaceFlinger снова включает генерацию событий VSync.
Смещения VSync
Приложение синхронизации и SurfaceFlinger зацикливаются на аппаратной вертикальной синхронизации (VSync). При событии VSync дисплей начинает показывать кадр N , а SurfaceFlinger начинает компоновку окон для кадра N+1 . Приложение обрабатывает ожидающие входные данные и генерирует кадр N+2 .
Синхронизация с помощью VSync обеспечивает стабильную задержку. Это уменьшает количество ошибок в приложениях и SurfaceFlinger, а также минимизирует смещение фаз между дисплеями. При этом предполагается, что время между кадрами в приложении и SurfaceFlinger различается незначительно. Задержка составляет не менее двух кадров.
Чтобы решить эту проблему, можно использовать смещения вертикальной синхронизации (VSync), чтобы уменьшить задержку ввода-вывода, устанавливая сигналы приложения и композиции относительно аппаратной вертикальной синхронизации. Это возможно, поскольку приложение и композиция обычно занимают менее 33 мс.
Результатом смещения VSync являются три сигнала с одинаковым периодом и смещенной фазой:
-
HW_VSYNC_0
— Дисплей начинает показывать следующий кадр. -
VSYNC
— приложение считывает входные данные и генерирует следующий кадр. -
SF_VSYNC
— SurfaceFlinger начинает композицию для следующего кадра.
Благодаря смещениям VSync SurfaceFlinger получает буфер и компонует кадр, в то время как приложение одновременно обрабатывает входные данные и визуализирует кадр.
DispSync
DispSync поддерживает модель периодических аппаратных событий VSync дисплея и использует эту модель для выполнения обратных вызовов при определенных смещениях фазы относительно аппаратных событий VSync.
DispSync — это программная фазовая автоподстройка частоты (ФАПЧ), которая генерирует сигналы VSYNC
и SF_VSYNC
, используемые Choreographer и SurfaceFlinger, даже если они не смещены относительно аппаратной VSync.
Поток DispSync проиллюстрирован на следующем рисунке:

Рисунок 1. Поток DispSync.
DispSync обладает следующими качествами:
- Ссылка —
HW_VSYNC_0
. - Выход —
VSYNC
иSF_VSYNC
. - Обратная связь — Удалить временные метки сигналов ограждения из HWC.
VSync отменяет смещения
Метка времени сигнала отмены границ должна соответствовать аппаратной вертикальной синхронизации (HW VSync), даже на устройствах, не использующих фазовое смещение. В противном случае ошибки кажутся более серьёзными, чем они есть на самом деле. Умные панели часто имеют дельту, где отмена границ совпадает с окончанием прямого доступа к памяти (DMA) к памяти дисплея, но фактическое переключение дисплея и аппаратная вертикальная синхронизация происходят позже.
Параметр 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. Эти смещения допускают длительное время рендеринга приложения и длительное время композиции на основе графического процессора.
Задержка более одной-двух миллисекунд заметна. Чтобы минимизировать задержку без значительного увеличения количества ошибок, внедрите тщательное автоматизированное тестирование на ошибки.