背景
最近在做Flutter知識(shí)學(xué)習(xí)的時(shí)候勘畔,有時(shí)間會(huì)看到vsync信號(hào)所灸,不知道所謂何物,所以專門抽時(shí)間簡(jiǎn)單學(xué)習(xí)了一下炫七,以此篇文章做個(gè)記錄爬立,具體內(nèi)容請(qǐng)查看我的參考資料即可
圖像生成到緩沖區(qū)
- GPU這個(gè)概念是由Nvidia公司于1999年提出的。GPU是顯卡上的一塊芯片万哪,就像CPU是主板上的一塊芯片
- 下面矩形框里面的應(yīng)該就是顯卡了
CPU和顯卡知乎解釋
- CPU 繪制 View 樹侠驯,計(jì)算好圖形數(shù)據(jù)抡秆,提交到系統(tǒng)內(nèi)存中
- CPU提交完成以后,通知 GPU 計(jì)算完成吟策,系統(tǒng)總線會(huì)把數(shù)據(jù)拷貝到 GPU 的顯存里
- GPU 開始處理數(shù)據(jù)儒士,以特定的 顯卡幀率 把數(shù)據(jù)寫到顯卡的緩沖區(qū)里
- 視頻控制器收到 垂直同步信號(hào) ,逐行讀取幀緩沖區(qū)的數(shù)據(jù)檩坚,交給顯示器
- 顯卡幀率:即 Frame Rate着撩,單位 fps,是指 gpu 生成幀的速率匾委,如 33 fps睹酌,60fps,越高越好剩檀。
#單緩沖
單緩沖憋沿,也就是只有一個(gè)緩沖區(qū)(buffer),GPU 向 buffer 中寫入數(shù)據(jù)沪猴,屏幕從 buffer 中取圖像數(shù)據(jù)辐啄、刷新后顯示,理想的情況是 顯卡幀率 和 屏幕刷新頻率 相等运嗜,每繪制一幀壶辜,屏幕顯示一幀。而實(shí)際情況是担租,二者之間沒有必然的大小關(guān)系砸民,如果沒有同步機(jī)制,很容易出現(xiàn)問題奋救。
- 例如岭参,當(dāng)顯卡幀率大于屏幕刷新頻率,屏幕準(zhǔn)備刷新第2幀的時(shí)候尝艘,GPU 已經(jīng)在生成第3幀了演侯,就會(huì)覆蓋第2幀的部分?jǐn)?shù)據(jù)。
- 當(dāng)屏幕開始刷新第2幀的時(shí)候背亥,緩沖區(qū)中的數(shù)據(jù)一部分是第3幀數(shù)據(jù)秒际,一部分是第2幀的數(shù)據(jù),顯示出來的圖像就會(huì)出現(xiàn)明顯的偏差狡汉,也就是撕裂(
tearing
)娄徊。
#雙緩沖
為了單緩沖的撕裂和效率問題,雙緩沖誕生了盾戴。
雙緩沖有兩個(gè)緩沖區(qū):frame buffer
寄锐、back buffer
,GPU 向 back buffer
中寫數(shù)據(jù),屏幕從 frame buffer
中讀數(shù)據(jù)锐峭。這樣不僅可以提升效率中鼠,而且可以避免因?yàn)閹屎退⑿侣什灰恢拢瑢?dǎo)致圖像數(shù)據(jù)錯(cuò)亂沿癞。
但是這兩個(gè) buffer
怎么去同步呢援雇?這里就需要 垂直同步信號(hào) 了
當(dāng)開啟垂直同步后,就會(huì)變成這樣:
- GPU 會(huì)等待 垂直同步信號(hào) 發(fā)出后椎扬,復(fù)制
back buffer
的數(shù)據(jù)到frame buffer
里(交換兩個(gè)緩沖區(qū)的內(nèi)存地址) - 渲染下一幀數(shù)據(jù)惫搏,寫到緩沖區(qū)里
這樣看來,幀率大于刷新頻率時(shí)蚕涤,幀率就會(huì)被迫跟刷新頻率保持同步筐赔,從而避免撕裂現(xiàn)象。
需要注意的是揖铜,雙緩沖 + 垂直同步信號(hào)仍然不能完全保證正常顯示茴丰,比如說:
- 收到垂直同步信號(hào)時(shí),如果 GPU 正在往緩沖區(qū)里寫數(shù)據(jù)天吓,CPU贿肩、GPU 繪制一幀的時(shí)間超過16ms,也就是一個(gè) 屏幕刷新周期 還沒有準(zhǔn)備完龄寞,這時(shí)候兩個(gè)緩沖區(qū)不會(huì)發(fā)生復(fù)制汰规。
- 當(dāng)屏幕進(jìn)入下一個(gè)刷新周期時(shí),從
frame buffer
中取出的是上一幀數(shù)據(jù)物邑,即兩個(gè)刷新周期顯示的是同一幀數(shù)據(jù)溜哮,也就是掉幀(Jank
)。
為此茂嗓,引入了 三緩沖,但是仍然避免不了卡頓和延遲的現(xiàn)象冒签,這里就不詳細(xì)介紹了在抛,可以自行查閱相關(guān)資料
顯示器部分
一貞數(shù)據(jù)是"掃描槍"先橫向掃描萧恕,然后再?gòu)南乱恍虚_頭再掃描一行,一直向下掃描到最后一行屹徘,從而完成一貞圖像
換一行有個(gè)短暫空白期走趋,這就是水平消隱,簡(jiǎn)稱 hblank(horizontal blank interval
完成一貞后從頭開始,有個(gè)短暫的空白期噪伊,這就是垂直消隱,
垂直同步信號(hào):當(dāng)掃描點(diǎn)回到初始點(diǎn)簿煌,在準(zhǔn)備掃描下一幀的時(shí)候氮唯,同時(shí)發(fā)出垂直同步信號(hào),告訴顯卡可以渲染下一幀了姨伟。這種情況下惩琉,顯卡的渲染能力會(huì)受到屏幕刷新率 的制約。如果顯示器刷新頻率是60Hz夺荒,顯卡幀率最多只會(huì)達(dá)到60瞒渠。對(duì)于高幀率的顯卡,開啟垂直同步自然會(huì)制約其性能發(fā)揮技扼。