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 流程](https://source.android.google.cn/static/docs/core/graphics/images/dispsync.png?authuser=19&hl=zh-tw)
圖 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 組合時間較長。
可能會發現延遲時間超過毫秒或兩秒以上。盡可能縮短延遲時間 而非大幅增加錯誤次數,整合全面自動化的錯誤 進行測試。