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

Сигнал VSync синхронизирует конвейер отображения. Конвейер отображения состоит из рендеринга приложений, композиции SurfaceFlinger и Hardware Composer (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

DispSync поддерживает модель периодических аппаратных событий VSync дисплея и использует эту модель для выполнения обратных вызовов при определенных смещениях фазы относительно аппаратных событий VSync.

DispSync — это программная фазовая автоподстройка частоты (ФАПЧ), которая генерирует сигналы VSYNC и SF_VSYNC , используемые Choreographer и SurfaceFlinger, даже если они не смещены относительно аппаратной VSync.

Поток DispSync проиллюстрирован на следующем рисунке:

Поток DispSync

Рисунок 1. Поток DispSync.

DispSync обладает следующими качествами:

  • СсылкаHW_VSYNC_0 .
  • ВыходVSYNC и SF_VSYNC .
  • Обратная связь — Удалить временные метки сигналов ограждения из HWC.

VSync отменяет смещения

Метка времени сигнала Reset Fences должна соответствовать HW VSync, даже на устройствах, которые не используют фазу смещения. В противном случае ошибки кажутся более серьезными, чем они есть на самом деле. Умные панели часто имеют дельту, где Reset Fence является концом прямого доступа к памяти (DMA) для отображения памяти, но фактическое переключение дисплея и HW VSync происходит некоторое время спустя.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS устанавливается в файле BoardConfig.mk устройства. Он основан на характеристиках контроллера дисплея и панели. Время от временной метки Reside Fence до сигнала HW VSync измеряется в наносекундах.

Смещения VSYNC и SF_VSYNC

VSYNC_EVENT_PHASE_OFFSET_NS и SF_VSYNC_EVENT_PHASE_OFFSET_NS устанавливаются консервативно на основе случаев использования с высокой нагрузкой, таких как частичная композиция GPU во время перехода окна или прокрутка Chrome через веб-страницу, содержащую анимацию. Эти смещения допускают длительное время рендеринга приложения и длительное время композиции GPU.

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