Чтобы понять это, лучше всего начать с документа Графическая архитектура системного уровня, обращая особое внимание на Раздел Необходимость тройной буферизации и связанная с ним диаграмма (в идеале это должен быть анимированный GIF). Предложение, начинающееся со слов «Если приложение начинает рендеринг на полпути между сигналами VSYNC», говорит именно о DispSync. Надеюсь, после того, как вы это прочтете, раздел DispSync графического документа устройства станет более понятным.
На большинстве устройств смещения DispSync не настроены, поэтому на самом деле имеется только один сигнал VSYNC. В дальнейшем я предполагаю, что DispSync включен.
Аппаратное обеспечение обеспечивает только один сигнал VSYNC, соответствующий обновлению основного дисплея. Остальные генерируются программно с помощью кода SurfaceFlinger DispSync, срабатывая с фиксированным смещением от фактического VSYNC. Некоторое умное программное обеспечение используется для предотвращения смещения таймингов по фазе.
Сигналы используются для запуска композиции SurfaceFlinger и отрисовки приложения. Если вы будете следовать разделу в документе по архитектуре, вы увидите, что это устанавливает два кадра задержки между тем, когда приложение отображает свое содержимое, и тем, когда содержимое появляется на экране. Подумайте об этом так: при трех случаях VSYNC приложение отрисовывает в V0, система выполняет композицию в V1, а скомпонованный кадр отправляется на дисплей в V2.
Если вы пытаетесь отслеживать сенсорный ввод, возможно, перемещая карту под пальцем пользователя, любая задержка будет восприниматься пользователем как вялая реакция на касание. Цель состоит в том, чтобы свести к минимуму задержку для улучшения взаимодействия с пользователем. Предположим, мы немного задержали события, поэтому приложение отрисовывает в версии 0.5, мы компонуем в версии 1.2, а затем переключаемся на отображение в версии 2. Смещая активность приложения и SF, мы уменьшаем общую задержку с 2 кадров до 1,5, как показано ниже.
Вот для чего нужен DispSync. На диаграмме обратной связи на странице, на которую вы ссылаетесь, HW_VSYNC_0 — это аппаратное обновление для физического дисплея, VSYNC вызывает визуализацию приложения, а SF_VSYNC заставляет SurfaceFlinger выполнять композицию. Ссылаться на них как «VSYNC» немного неправильно, но на ЖК-панели называть что-либо «VSYNC», вероятно, неправильно.
«Временные метки удаления», отмеченные на диаграмме цикла обратной связи, относятся к умной оптимизации. Поскольку мы не выполняем никакой работы с фактическим аппаратным VSYNC, мы можем быть немного более эффективными, если отключим сигнал обновления. Вместо этого код DispSync будет использовать временные метки от удаленных ограждений (что является совершенно другим обсуждением), чтобы увидеть, не происходит ли рассинхронизация, и временно повторно активирует аппаратный сигнал, пока он не вернется в нужное русло.
Изменить: вы можете увидеть, как настроены значения в файле Конфигурация платы Nexus 5. Обратите внимание на настройки для VSYNC_EVENT_PHASE_OFFSET_NS
и SF_VSYNC_EVENT_PHASE_OFFSET_NS
.
person
fadden
schedule
14.01.2015