番外——深入垂直同步機(jī)制(VSYNC)

Paste_Image.png

<h4>一、基本概念</h4>

  • 刷新率
    代表屏幕在一秒內(nèi)刷新屏幕的次數(shù),這個(gè)值取決于硬件的固定參數(shù).一般是60Hz,即每16.66ms刷新一次.

  • 幀速率
    代表了GPU在一秒內(nèi)繪制操作的幀數(shù),比如30fps/60fps.在這種情況下,高點(diǎn)的幀速率總是好的.

<h4>二、工作原理 </h4>
刷新率和幀速率需要協(xié)同工作,才能讓你的應(yīng)用程序的內(nèi)容顯示到屏幕上,GPU會(huì)獲取圖像數(shù)據(jù)進(jìn)行繪制,然后負(fù)責(zé)把內(nèi)容呈現(xiàn)到屏幕上,這將在你的應(yīng)用程序的生命周期中周而復(fù)始地發(fā)生.
<h4>三、協(xié)同工作</h4>
不幸的是,刷新率和幀速率并不是總能夠保持相同的節(jié)奏:
<h6>幀速率比刷新率快的情況</h6>

  • 如果幀速率實(shí)際上比刷新率快,那么就會(huì)出現(xiàn)一些視覺上的問題,比如當(dāng)幀速率在100fps而刷新率只有75Hz的時(shí)候,GPU所渲染的圖像并非全都被顯示出來.
  • 舉個(gè)例子, 你拍了一張照片,然后旋轉(zhuǎn)90度再拍一張照片,將兩種圖片的中間剪開并拼接在一起:剪貼在一起這兩張圖有相似之處,但是上面和下面部分有明顯的區(qū)別,這就叫Tearing(撕裂),是刷新率和幀速率不一致的結(jié)果. 當(dāng)你的顯卡正在使用,一個(gè)內(nèi)存區(qū)正在寫入幀數(shù)據(jù)(用來顯示一幀的一個(gè)Buffer),從頂部開始,新的一幀覆蓋前一幀,并立刻輸出一行內(nèi)容.于是,當(dāng)屏幕開始刷新時(shí),實(shí)際上并不知道緩沖區(qū)是什么狀態(tài)(即不知道緩沖區(qū)中的一幀是否繪制完畢,即存在只繪制了一半的情況,另一半還是之前的那幀),因此它從GPU中抓住的幀肯可能并不是完全完整的.
  • 目前Android的雙緩沖(或者三緩沖/四緩沖),這是非常有效的,當(dāng)GPU將一幀寫入一個(gè)被稱為后緩沖的存儲(chǔ)器, 而存儲(chǔ)器中的次級(jí)區(qū)域被稱為幀緩沖,當(dāng)寫入下一幀時(shí),它會(huì)開始填充后緩沖,而幀緩沖保持不變,現(xiàn)在我們刷新屏幕,它將使用幀緩沖(事先已經(jīng)繪制好),而不是正在處于繪制狀態(tài)的后緩沖,這就是VSYNC的作用.如果在屏幕刷新中,VSYNC,即垂直同步,將會(huì)在讓從后緩沖到幀緩沖的拷貝過程保持同樣的復(fù)制操作.
  • GPU的頻率比屏幕刷新率高是正常的,因?yàn)槟愕腉PU刷新會(huì)比屏幕刷新快,在這種情況下,當(dāng)屏幕刷新成功,你的GPU將會(huì)等待VSYNC信號(hào),直到下一個(gè)VSYNC信號(hào)到來時(shí)(即屏幕刷新時(shí)),這時(shí)你的幀速率就可以達(dá)到設(shè)備的刷新率上限. 當(dāng)然這只是理想情況,當(dāng)fps達(dá)到60的時(shí)候,GPU需要在16.66ms內(nèi)準(zhǔn)備好一幀,這對(duì)應(yīng)用程序的要求是非常高的.更不用說100fps了…
    <h6>屏幕刷新率比幀速率快的情況 </h6>
  • 如果屏幕刷新率比幀速率快,屏幕會(huì)在兩幀中顯示同一個(gè)畫面,當(dāng)這種斷斷續(xù)續(xù)的情況發(fā)生時(shí),你就遇到麻煩了.比如你的幀速率比屏幕刷新率高的時(shí)候,用戶看到的是非常流暢的畫面,但是幀速率降下來的時(shí)候(GPU繪制太多東西的時(shí)候),用戶將會(huì)很明顯地察覺到動(dòng)畫卡住了或者掉幀,然后又恢復(fù)了流暢.這通常會(huì)被描述為閃屏, 跳幀,延遲.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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