Вертикальная синхронизация,Вертикальная синхронизация

Сигнал 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 проиллюстрирован на следующем рисунке:

Поток 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. Эти смещения допускают длительное время рендеринга приложения и длительное время композиции на основе графического процессора.

Задержка более одной-двух миллисекунд заметна. Чтобы минимизировать задержку без значительного увеличения количества ошибок, внедрите тщательное автоматизированное тестирование на ошибки.