1煞赢、系統(tǒng)每隔1/60秒發(fā)出VSYNC信號抛计;
2哄孤、當(dāng)繪制系統(tǒng)收到VSYNC信號后照筑,CPU和GPU依次開始對下一幀的數(shù)據(jù)進(jìn)行計(jì)算;
3瘦陈、當(dāng)GPU計(jì)算完成凝危,系統(tǒng)在接收到下一個(gè)VSYNC信號時(shí),將繪制結(jié)果上屏晨逝。
當(dāng)每一幀的處理時(shí)間都小于1/60秒時(shí)蛾默,整個(gè)系統(tǒng)都可以保證流暢的繪制。
在上圖中捉貌,A支鸡、B分別代表兩個(gè)不同的緩沖區(qū),這種系統(tǒng)也就是我們常說的「雙緩沖系統(tǒng)」趁窃。
在雙緩沖系統(tǒng)中的同一個(gè)時(shí)刻牧挣,兩個(gè)緩沖區(qū)會分別處于「顯示(Display)」和「待上屏(CPU+GPU+空閑)」兩個(gè)狀態(tài)。當(dāng)處于「待上屏」的緩沖區(qū)已經(jīng)繪制完成醒陆,并處于空閑狀態(tài)瀑构,在下一個(gè)VSYNC信號到達(dá)時(shí)會進(jìn)行緩沖區(qū)切換。
雙緩沖系統(tǒng)可以有效的避免當(dāng)繪制速度與屏幕刷新速度不匹配時(shí)刨摩,新舊畫面的一部分同時(shí)顯示在屏幕上的問題寺晌。
然而在雙緩沖系統(tǒng)中,如果連續(xù)兩幀出現(xiàn)處理超時(shí)澡刹,就會出現(xiàn)下圖中的現(xiàn)象:
當(dāng)?shù)谝粋€(gè)VSYNC信號到來時(shí)呻征,由于GPU對B緩沖區(qū)的操作還沒有結(jié)束,錯(cuò)過了上屏?xí)r機(jī)罢浇。根據(jù)雙重緩沖區(qū)的特性陆赋,雖然CPU已經(jīng)處于空閑狀態(tài),但由于B緩沖區(qū)的數(shù)據(jù)還沒有準(zhǔn)備好己莺,而A緩沖區(qū)的數(shù)據(jù)正處于顯示的過程中奏甫,此時(shí)已經(jīng)沒有緩沖區(qū)可供CPU進(jìn)行下一幀的計(jì)算,這就導(dǎo)致了在前兩個(gè)VSYNC信號之間凌受,CPU都處于空閑的狀態(tài)阵子,而GPU也有大部分時(shí)間處于空閑。
雙緩沖系統(tǒng)在這種情況下胜蛉,4個(gè)VSYNC周期內(nèi)丟失了兩幀挠进。
如果在這種情況下色乾,系統(tǒng)再額外提供一個(gè)緩沖區(qū),就可以讓CPU在第二個(gè)VSYNC信號到來的同時(shí)進(jìn)入工作狀態(tài):
在三重緩沖系統(tǒng)中领突,第一個(gè)VSYNC信號到來時(shí)暖璧,系統(tǒng)發(fā)現(xiàn)A、B緩沖區(qū)正在使用中君旦,但是CPU此時(shí)處于空閑狀態(tài)澎办。此時(shí),系統(tǒng)會再次分配一個(gè)緩沖區(qū)C金砍,讓CPU立即開始下一幀的計(jì)算局蚀。
對比雙緩沖系統(tǒng),三重緩沖在這種場景下可以保證讓每一個(gè)VSYNC信號都觸發(fā)下一幀的計(jì)算恕稠,這樣即便有兩幀的處理時(shí)間超過了1/60秒琅绅,但仍能避免第二幀的計(jì)算超時(shí)導(dǎo)致的丟幀,繪制效率提升了25%鹅巍。