同步

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的控制HWC是否通過調用生成VSYNC事件setVsyncEnabled 。 SurfaceFlinger的能使setVsyncEnabled產生VSYNC事件,以便它可以與顯示器的刷新週期同步。當SurfaceFlinger的被同步到顯示刷新週期,SurfaceFlinger的禁用setVsyncEnabled從生成VSYNC事件停止HWC。如果 SurfaceFlinger 檢測到實際 VSYNC 和它之前建立的 VSYNC 之間存在差異,SurfaceFlinger 將重新啟用 VSYNC 事件生成。

VSYNC 偏移

同步應用程序和 SurfaceFlinger 渲染循環到硬件 VSYNC。在一個VSYNC事件,開始顯示表示同時開始SurfaceFlinger的合成幀N + 1的窗口幀N。該應用句柄掛起的輸入,並產生幀N + 2。

與 VSYNC 同步可提供一致的延遲。它減少了應用程序和 SurfaceFlinger 中的錯誤,並最大限度地減少了彼此同相和異相的顯示。這假設應用程序和 SurfaceFlinger 每幀時間不會有很大差異。延遲至少為兩幀。

為了解決這個問題,您可以使用 VSYNC 偏移量,通過使應用程序和合成信號相對於硬件 VSYNC 來減少輸入到顯示的延遲。這是可能的,因為 app plus 組合通常需要不到 33 毫秒。

VSYNC 偏移的結果是三個具有相同周期和偏移相位的信號:

  • HW_VSYNC_0 -顯示開始顯示下一幀。
  • VSYNC -應用讀取輸入並產生下一幀。
  • SF_VSYNC - SurfaceFlinger的開始合成為下一幀。

通過 VSYNC 偏移,SurfaceFlinger 接收緩衝區並合成幀,同時應用程序同時處理輸入和渲染幀。

顯示同步

DispSync 維護顯示器的基於硬件的周期性 VSYNC 事件的模型,並使用該模型在硬件 VSYNC 事件的特定相位偏移處執行回調。

DispSync 是一個軟件鎖相環 (PLL),它生成 Choreographer 和 SurfaceFlinger 使用的 VSYNC 和 SF_VSYNC 信號,即使沒有從硬件 VSYNC 偏移。

顯示同步流程

圖1. DispSync流

DispSync 具有以下特性:

  • 參考- HW_VSYNC_0。
  • 輸出- VSYNC和SF_VSYNC。
  • 反饋-從硬件合成退休柵欄信號的時間戳。

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設定保守基於高負載使用的情況下,如窗口過渡或Chrome通過含有動畫的網頁滾動期間局部GPU組合物。這些偏移允許較長的應用程序渲染時間和較長的 GPU 合成時間。

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