ВСИНХ

Сигнал 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 — это программная система фазовой автоподстройки частоты (PLL), которая генерирует сигналы VSYNC и SF_VSYNC, используемые Choreographer и SurfaceFlinger, даже если они не смещены от аппаратной VSYNC.

Поток DispSync

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

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