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
DispSync 會維護顯示器定期硬體 VSYNC 事件的模型,並使用該模型在硬體 VSYNC 事件的特定相位偏移處執行回呼。
DispSync 是軟體相位鎖定迴圈 (PLL),可產生 Choreographer 和 SurfaceFlinger 使用的 VSYNC 和 SF_VSYNC 信號,即使未從硬體 VSYNC 偏移也一樣。

圖 1. DispSync 流程
DispSync 具有下列優點:
- 參考資料:HW_VSYNC_0。
- 輸出:VSYNC 和 SF_VSYNC。
- 意見回饋:從硬體編寫器中移除邊界信號時間戳記。
VSYNC/retire 偏移
退出柵欄的信號時間戳記必須與 HW VSYNC 相符,即使是未使用偏移階段的裝置也一樣。否則,錯誤會顯示為比實際嚴重。智慧面板通常會有差異,其中退休圍欄是顯示記憶體的直接記憶體存取 (DMA) 結尾,但實際的顯示切換和硬體 VSYNC 會在稍後才執行。
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
已在裝置的 BoardConfig.mk
makefile 中設定。取決於螢幕控制器和面板特性。從退出柵欄時間戳記到 HW VSYNC 信號的時間,以奈秒為單位。
VSYNC 和 SF_VSYNC 偏移
VSYNC_EVENT_PHASE_OFFSET_NS
和 SF_VSYNC_EVENT_PHASE_OFFSET_NS
會根據高負載用途設定為保守值,例如在視窗轉換期間的部分 GPU 組合,或是 Chrome 在包含動畫的網頁中捲動畫面。這些偏移值可讓應用程式有較長的轉譯時間和 GPU 合成時間。
延遲時間超過一兩毫秒就會明顯感覺到。如要盡量縮短延遲時間,且不大幅增加錯誤數量,請整合徹底的自動化錯誤測試。