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 流](https://source.android.google.cn/static/devices/graphics/images/dispsync.png?authuser=2&hl=zh-tw)
圖 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_NS
和SF_VSYNC_EVENT_PHASE_OFFSET_NS
是根據高負載用例保守設置的,例如窗口轉換期間的部分 GPU 組合或 Chrome 滾動瀏覽包含動畫的網頁。這些偏移量允許較長的應用程序渲染時間和較長的 GPU 合成時間。
超過一兩毫秒的延遲是顯而易見的。為了在不顯著增加錯誤計數的情況下最大限度地減少延遲,請集成徹底的自動化錯誤測試。