垂直同步

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 通過調用setVsyncEnabled來控制 HWC 是否生成 VSYNC 事件。 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 維護顯示器的周期性基於硬件的 VSYNC 事件的模型,並使用該模型在硬件 VSYNC 事件的特定相位偏移處執行回調。

DispSync 是一個軟件鎖相環 (PLL),它生成 Choreographer 和 SurfaceFlinger 使用的 VSYNC 和 SF_VSYNC 信號,即使沒有從硬件 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在設備的BoardConfig.mk生成文件中設置。它基於顯示控制器和麵板特性。從退出圍欄時間戳到 HW VSYNC 信號的時間以納秒為單位測量。

VSYNC 和 SF_VSYNC 偏移量

VSYNC_EVENT_PHASE_OFFSET_NSSF_VSYNC_EVENT_PHASE_OFFSET_NS是根據高負載用例保守設置的,例如窗口轉換期間的部分 GPU 組合或 Chrome 滾動瀏覽包含動畫的網頁。這些偏移量允許較長的應用程序渲染時間和較長的 GPU 合成時間。

超過一兩毫秒的延遲是顯而易見的。為了在不顯著增加錯誤計數的情況下最大限度地減少延遲,請集成徹底的自動化錯誤測試。