VSync傳遞之 SF

VSync 虛擬化

為了提高UI的響應(yīng)速度, Android重新設(shè)計了VSync的相應(yīng)邏輯。

  • 先來看下VSync的響應(yīng):
    VSync到來, SFApp同時接收到VSync, 這個時候SF肯定需要等待App端把UI繪制完畢, 然后才能進(jìn)行混合輸出. 這個時候SF先休眠然后再喚醒,這里肯定涉及到CPU的上下文調(diào)度, 需要消耗一定的時間。
  • 做一個假設(shè):
    VSync到來, App先接收到VSync, 然后SF等待一段時間再接收到這個VSync, 如果App繪制UI比較快, 則等到SF喚醒的時候, 無需等待就可以繼續(xù)工作了, 這里就避免了一次CPU的調(diào)度。
  • 總結(jié)


    display.png

Android 就是考慮到上面的這個假設(shè), 設(shè)計了虛擬化的VSync.

Sync.png

DispSync接收到VSync之后, 先發(fā)給App然后過段時間再發(fā)給SF.

SF中傳遞線程關(guān)聯(lián)方式

通過上面介紹了解到, SF 收到 HWC 傳遞過來的VSync, 先傳遞到 DispSyncThreadVSync分發(fā)線程), 然后分發(fā)給 EventThreadVSync處理線程)。

Vsync_process.png

看圖中粉紅色線部分:
1: EventThreadVSync處理線程)啟動之后, 進(jìn)入 threadLoop 循環(huán), 調(diào)用 waitForEvent方法, 激活整個傳遞流程。
2: waitForEvent 調(diào)用 enableVSyncLocked。
2-1:enableVSyncLocked 第一步把 EventThread 自己設(shè)置為 DispSyncSource 的回調(diào)。
2-2:DispSyncSource通過setVSyncEnabled把自己添加到 DispSync 的回調(diào) mEventListeners中。

PSDispSyncDispSyncSource 的初始化都在SFinit中。 這里都比較簡單, 畫出來圖就太多線了。

SF中VSync的傳遞

VsyncProcess.png

圖中綠線部分, 接著上節(jié)傳遞的位置 onVSyncReceived。

Vsync_thread.png

整個流程跟著箭頭走比較清晰, 其中涉及到三次跨線程交互。

前兩次都是通過 Condition 進(jìn)行喚醒的, 最后一次通過的是本地套接字喚醒的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容