垂直同步

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 事件產生。

垂直同步偏移

同步應用程式和 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),即使沒有從硬體 VSYNC 偏移,它也會產生 Choreographer 和 SurfaceFlinger 使用的 VSYNC 和 SF_VSYNC 訊號。

顯示同步流程

圖 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 makefile 中設定。它基於顯示控制器和麵板特性。從退休柵欄時間戳到 HW VSYNC 訊號的時間以奈秒為單位測量。

VSYNC 和 SF_VSYNC 偏移

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

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