Сигнал 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 синхронизируется с циклом обновления экрана, он отключает setVsyncEnabled, чтобы HWC не создавал события VSync. Если SurfaceFlinger обнаруживает разницу между фактическим сигналом VSync и сигналом VSync, установленным ранее, SurfaceFlinger повторно включает генерацию событий VSync.
Смещения VSync
Приложение для синхронизации и SurfaceFlinger выполняют циклы отрисовки в соответствии с аппаратной вертикальной синхронизацией. При событии 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, даже если они не смещены относительно аппаратной вертикальной синхронизации.
Поток DispSync проиллюстрирован на следующем рисунке:
Рисунок 1. Процесс DispSync.
DispSync обладает следующими качествами:
- Reference –
HW_VSYNC_0. - Выходные данные –
VSYNCиSF_VSYNC. - Отзыв – удаление временных меток сигналов ограждения из HWC.
Сдвиги VSync
Временная метка сигнала для барьеров удаления должна совпадать с сигналом VSync оборудования, даже на устройствах, которые не используют фазу смещения. В противном случае ошибки будут казаться более серьезными, чем они есть на самом деле. Умные панели часто имеют дельту, где граница выхода на пенсию является концом прямого доступа к памяти (DMA) для отображения памяти, но фактического переключения дисплея и HW VSync через некоторое время.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS задается в файле makefile BoardConfig.mk устройства. Оно зависит от характеристик контроллера и панели дисплея. Время от временной метки барьера до сигнала HW VSync измеряется в наносекундах.
Смещения VSYNC и SF_VSYNC
Значения VSYNC_EVENT_PHASE_OFFSET_NS и SF_VSYNC_EVENT_PHASE_OFFSET_NS задаются с запасом, исходя из сценариев с высокой нагрузкой, таких как частичная композиция графического процессора во время перехода между окнами или прокрутка веб-страницы с анимацией в Chrome. Эти смещения позволяют увеличить время отрисовки приложения и время композиции графического процессора.
Задержка в несколько миллисекунд уже заметна. Чтобы свести к минимуму задержку без значительного увеличения количества ошибок, интегрируйте тщательное автоматическое тестирование ошибок.