標(biāo)題先寫。
之前看了一次SF, 感覺到一知半解, 畫了些圖, 總感覺沒找到重點(diǎn), 而且有些問題太深入(Fence), 反而影響整體的理解, 網(wǎng)上的文章要么太深入, 要么太淺顯, 要么就是太依賴代碼, 很少有一個把大致的流程介紹的淺顯易懂的。
我覺得代碼都是開源的, 哪里都有, 把重點(diǎn)問題列出來, 流程說清楚, 特別是白前因后果。
有了前因后果再去看問題, 就可以事半功倍。
----------------------吐槽分割線--------------------------
VSync 百度百科
V-Sync(垂直同步)這個功能事實(shí)上由來已久,早于Voodoo2的時代V-Sync就已引入到DirectX和Windows操作系統(tǒng)當(dāng)中,其作用主要是讓顯卡的運(yùn)算和顯示器刷新率一致以穩(wěn)定輸出的畫面質(zhì)量。
VSync 解決的問題
VSync 主要解決的就是上面這個問題。
產(chǎn)生的原因:
假設(shè)屏幕刷新率為60HZ, 顯卡的刷新率是100HZ。
當(dāng)顯示第一幀的時候, 大家都沒問題, 當(dāng)顯示第二幀的時候, 屏幕可能刷新到一半的時候, 顯示的內(nèi)容被顯卡給更新了, 導(dǎo)致下半部分的內(nèi)容跟上半部分不一致。 (這里涉及到了屏幕更新, 可以想象成從上到下,從左到右, 屏幕上的內(nèi)容是一個一個像素的更新的, 只是更新速率夠快, 人感覺不到)
解決的方式:
屏幕每次刷新之前就會發(fā)送一個信號告訴系統(tǒng), 我現(xiàn)在準(zhǔn)備刷新了, 然后系統(tǒng)再去調(diào)用CPU和GPU進(jìn)行UI更新。
不使用VSync更新UI
顯示器Display
的更新速率是穩(wěn)定的。
CPU
和GPU
的繪制的時間是不固定的。
這就導(dǎo)致了Jank
的出現(xiàn)。
1: 第一個VSync到來的時候,Display
顯示幀1
, CPU
休眠了一段時間再運(yùn)行。
2: 第二個VSync到來的時候, 由于上一幀的幀2
沒有生成, 所以Display
仍然顯示幀1
。(這就導(dǎo)致了畫面延遲的問題)
3: 第三個VSync到來的時候, 幀2
的內(nèi)容終于顯示完畢, Display
顯示幀2
總結(jié): 由于CPU
和GPU
更新的時間點(diǎn)不固定, 導(dǎo)致UI不能及時被顯示到屏幕上。
(PS: Display
把UI從內(nèi)存顯示到屏幕上, 這個時間很短暫, 可以忽略不計(jì), 如果沒有這個概念, 有些問題會想不明白)
使用VSync更新UI
1: 第一個VSync到來的時候,
Display
顯示幀1
, CPU
立刻運(yùn)行,然后GPU
也接著運(yùn)行,并且生成幀2
.2: 第二個VSync到來的時候, 由于幀
2
已經(jīng)生成, 所以Display
顯示幀2
, CPU
立刻運(yùn)行,然后GPU
也接著運(yùn)行,并且生成內(nèi)容3
.3: 第三個VSync到來的時候, 由于幀
3
已經(jīng)生成, 所以Display
顯示幀3
, CPU
立刻運(yùn)行,然后GPU
也接著運(yùn)行,并且生成內(nèi)容4
.總結(jié): 由于
CPU
和GPU
在每次VSync到來之后立刻執(zhí)行, 如果能保證CPU
和GPU
運(yùn)行的時間在一個VSync的周期內(nèi), 那么是不會出現(xiàn)Jank
的。
- 1: VSync傳遞之 HWC -> SF
- 2: VSync傳遞之 SF
- 3: VSync傳遞之 App
備注:
圖片拷貝了網(wǎng)上的圖片。