1. 移動(dòng)設(shè)備顯示原理:CPU 計(jì)算好要顯示的內(nèi)容提交給 GPU,GPU 渲染完成后將渲染結(jié)果放入幀緩存區(qū),隨后視頻播放器在刷新幀的時(shí)候發(fā)出 VSync 信號(hào)逐行讀取幀緩存區(qū)的數(shù)據(jù),經(jīng)過數(shù)模傳輸給顯示器顯示
2. 單緩存機(jī)制:在最簡(jiǎn)單的情況下,幀緩存區(qū)只有一個(gè),這樣的話幀緩存區(qū)的讀取的刷新都會(huì)有較大的問題。
3. 雙緩存機(jī)制:為了解決效率問題,顯示系統(tǒng)通常會(huì)引入兩個(gè)幀緩存區(qū)。在這種情況下,GPU會(huì)預(yù)先渲染好一幀放入一個(gè)緩存區(qū)內(nèi),讓視頻控制器讀取。當(dāng)下一幀渲染好后 GPU 會(huì)直接把視頻控制器的指針指向第二個(gè)緩存區(qū),這樣效率會(huì)有很大提升,但是同時(shí)帶來一個(gè)問題,就是當(dāng)視頻控制器還未讀取完成,即屏幕內(nèi)容剛顯示一半時(shí),GPU 可能將新的一幀內(nèi)容提交到幀緩存區(qū),此時(shí)視頻控制器就會(huì)把新的一幀數(shù)據(jù)的下半段顯示到屏幕上,造成畫面撕裂的現(xiàn)象。
4. 雙緩存機(jī)制+垂直同步機(jī)制:為了解決雙緩存機(jī)制帶來的畫面撕裂的問題,GPU 通常會(huì)有一個(gè)垂直同步機(jī)制:GPU 會(huì)等待顯示器的 VSync 信號(hào)發(fā)出后,,才進(jìn)行新的一幀和緩存區(qū)更新,這樣能解決畫面撕裂的現(xiàn)象,也增加了畫面流暢度,但需要消耗更多的計(jì)算資源,也會(huì)帶來部分的延遲。iOS 設(shè)備使用的是雙緩存機(jī)制+垂直同步機(jī)制,安卓在 4.1 版本以后才引入垂直同步機(jī)制,使用的是三緩存+垂直同步機(jī)制。
5. 造成卡頓的原因:iOS 使用的是雙緩存+垂直同步機(jī)制,當(dāng) VSync 信號(hào)到來之后,系統(tǒng)圖形服務(wù)會(huì)通過 CADisplayLink 等機(jī)制通知 App ,App 主線程開始在 CPU 中計(jì)算顯示內(nèi)容,比如視圖的創(chuàng)建、布局計(jì)算、圖片解碼、文本繪制等,隨后 CPU 會(huì)將計(jì)算好的內(nèi)容提交到 GPU 中,由 GPU 來完成變換、合成、渲染,隨后 GPU 將渲染結(jié)果提交到幀緩存區(qū),等待下一次 VSync 信號(hào)到來的時(shí)候顯示到屏幕上。由于垂直同步機(jī)制,如果在一個(gè) VSync 時(shí)間內(nèi),CPU 或者 GPU 沒有完成內(nèi)容提交,那么這一幀就會(huì)被丟棄,等待下一次 VSync 信號(hào),而這時(shí)候顯示屏?xí)3种暗膬?nèi)容不變,這樣就造成了內(nèi)存卡頓。不論是 CPU 還是 GPU 阻擋了顯示流程,都會(huì)造成掉幀,所以在開發(fā)的時(shí)候需要分別對(duì) CPU 和 GPU 壓力進(jìn)行評(píng)估和優(yōu)化。