VSYNC

VSYNC 信號會同步處理顯示管道。螢幕 管道包含應用程式轉譯、SurfaceFlinger 組合和 Hardware Composer (HWC) 會在螢幕上顯示圖片。VSYNC 會同步處理 應用程式喚醒並開始轉譯的時間,SurfaceFlinger 會在 合成螢幕,以及畫面重新整理循環。這項同步處理作業 即可消除延遲並提高圖形的視覺效能。

HWC 產生 VSYNC 事件,並透過 回呼:

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 到 讓 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 之間不會產生偏移。

DispSync 流程

圖 1. DispSync 流程

DispSync 具備下列特質:

  • 參考資料 - HW_VSYNC_0。
  • 輸出 - VSYNC 和 SF_VSYNC。
  • 「Feedback」(意見回饋) - 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_NS」和 SF_VSYNC_EVENT_PHASE_OFFSET_NS的彈性設定依據 高負載的用途,例如視窗轉換期間的部分 GPU 組合 或 Chrome 捲動瀏覽含有動畫的網頁這些偏移量 因此應用程式轉譯時間較長, GPU 組合時間較長。

可能會發現延遲時間超過毫秒或兩秒以上。盡可能縮短延遲時間 而非大幅增加錯誤次數,整合全面自動化的錯誤 進行測試。