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會獲取圖像數(shù)據(jù)進(jìn)行繪制,然后負(fù)責(zé)把內(nèi)容呈現(xiàn)到屏幕上,這將在你的應(yīng)用程序的生命周期中周而復(fù)始地發(fā)生.
<h4>三誓沸、協(xié)同工作</h4>
不幸的是,刷新率和幀速率并不是總能夠保持相同的節(jié)奏:
<h6>幀速率比刷新率快的情況</h6>
- 如果幀速率實(shí)際上比刷新率快,那么就會出現(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è)被稱為后緩沖的存儲器, 而存儲器中的次級區(qū)域被稱為幀緩沖,當(dāng)寫入下一幀時(shí),它會開始填充后緩沖,而幀緩沖保持不變,現(xiàn)在我們刷新屏幕,它將使用幀緩沖(事先已經(jīng)繪制好),而不是正在處于繪制狀態(tài)的后緩沖,這就是VSYNC的作用.如果在屏幕刷新中,VSYNC,即垂直同步,將會在讓從后緩沖到幀緩沖的拷貝過程保持同樣的復(fù)制操作.
- GPU的頻率比屏幕刷新率高是正常的,因?yàn)槟愕腉PU刷新會比屏幕刷新快,在這種情況下,當(dāng)屏幕刷新成功,你的GPU將會等待VSYNC信號,直到下一個(gè)VSYNC信號到來時(shí)(即屏幕刷新時(shí)),這時(shí)你的幀速率就可以達(dá)到設(shè)備的刷新率上限. 當(dāng)然這只是理想情況,當(dāng)fps達(dá)到60的時(shí)候,GPU需要在16.66ms內(nèi)準(zhǔn)備好一幀,這對應(yīng)用程序的要求是非常高的.更不用說100fps了…
<h6>屏幕刷新率比幀速率快的情況 </h6> - 如果屏幕刷新率比幀速率快,屏幕會在兩幀中顯示同一個(gè)畫面,當(dāng)這種斷斷續(xù)續(xù)的情況發(fā)生時(shí),你就遇到麻煩了.比如你的幀速率比屏幕刷新率高的時(shí)候,用戶看到的是非常流暢的畫面,但是幀速率降下來的時(shí)候(GPU繪制太多東西的時(shí)候),用戶將會很明顯地察覺到動(dòng)畫卡住了或者掉幀,然后又恢復(fù)了流暢.這通常會被描述為閃屏, 跳幀,延遲.