Unbeknown to most developers, there’s a simple hardware design that defines everything about how fast your application can draw things to the screen.
You may have heard the term VSYNC - VSYNC stands for vertical synchronization and it's an event that happens every time your screen starts to refresh the content it wants to show you.
Effectively, VSYNC is the product of two components Refresh Rate (how fast the hardware can refresh the screen), and Frames Per Second (how fast the GPU can draw images), and in this video +Colt McAnlis walks through each of these topics, and discusses where VSYNC (and the 16ms rendering barrier) comes from, and why it’s critical to understand if you want a silky smooth application.
基本概念
想要開(kāi)發(fā)一個(gè)高性能的應(yīng)用程序,首先你得了解他的硬件工作原理,那么最好的辦法就是去使用它,應(yīng)用程序運(yùn)行速度的快慢,很容易被人誤解為硬件進(jìn)程的控制問(wèn)題,然而這最主要的根源在于渲染性能.如果你想要提高你應(yīng)用程序的渲染性能,你就必須知道什么是VSYNC.
在了解VSYNC之前,我們需要了解兩個(gè)概念:
刷新率
刷新率代表屏幕在一秒內(nèi)刷新屏幕的次數(shù),這個(gè)值用赫茲來(lái)表示,取決于硬件的固定參數(shù). 這個(gè)值一般是60Hz,即每16.66ms刷新一次屏幕.
幀速率
幀速率代表了GPU在一秒內(nèi)繪制操作的幀數(shù),比如30fps/60fps.在這種情況下,高點(diǎn)的幀速率總是好的.
工作原理
刷新率和幀速率需要協(xié)同工作,才能讓你的應(yīng)用程序的內(nèi)容顯示到屏幕上,GPU會(huì)獲取圖像數(shù)據(jù)進(jìn)行繪制,然后硬件負(fù)責(zé)把內(nèi)容呈現(xiàn)到屏幕上,這將在你的應(yīng)用程序的生命周期中周而復(fù)始地發(fā)生.下面的圖中每一個(gè)豎行代表了一幀的繪制和呈現(xiàn)工作.
不幸的是,刷新率和幀速率并不是總能夠保持相同的節(jié)奏:
-
如果幀速率實(shí)際上比刷新率快,那么就會(huì)出現(xiàn)一些視覺(jué)上的問(wèn)題,下面的圖中可以看到,當(dāng)幀速率在100fps而刷新率只有75Hz的時(shí)候,GPU所渲染的圖像并非全都被顯示出來(lái).
幀速率比刷新率快的情況舉個(gè)例子, 你拍了一張照片,然后旋轉(zhuǎn)5度再拍一張照片, 將兩種圖片的中間剪開(kāi)并拼接在一起:
拍兩張照片
剪貼在一起
這兩張圖有相似之處,但是上面和下面部分有明顯的區(qū)別,這就叫Tearing(撕裂),是刷新率和幀速率不一致的結(jié)果.
上面的原因是因?yàn)?當(dāng)你的顯卡正在使用,一個(gè)內(nèi)存區(qū)正在寫(xiě)入幀數(shù)據(jù)(用來(lái)顯示一幀的一個(gè)Buffer),從頂部開(kāi)始, 新的一幀覆蓋前一幀,并立刻輸出一行內(nèi)容. 現(xiàn)在,當(dāng)屏幕開(kāi)始刷新時(shí),實(shí)際上并不知道緩沖區(qū)是什么狀態(tài)(即不知道緩沖區(qū)中的一幀是否繪制完畢,即存在只繪制了一半的情況,另一半還是之前的那幀),因此它從GPU中抓住的幀肯可能并不是完全完整的.
圖像撕裂目前Android的雙緩沖(或者三緩沖/四緩沖), 這是非常有效的,當(dāng)GPU將一幀寫(xiě)入一個(gè)被成為后緩沖的存儲(chǔ)器, 而存儲(chǔ)器中的次級(jí)區(qū)域被稱為幀緩沖,當(dāng)寫(xiě)入下一幀時(shí),它會(huì)開(kāi)始填充后緩沖,而幀緩沖保持不變,現(xiàn)在我們刷新屏幕,它將使用幀緩沖(事先已經(jīng)繪制好),而不是正在處于繪制狀態(tài)的后緩沖, 這就是VSYNC的作用.如果在屏幕刷新中,VSYNC,即垂直同步,將會(huì)在讓從后緩沖到幀緩沖的拷貝過(guò)程保持同樣的復(fù)制操作:
VsyncGPU的頻率比屏幕刷新率高是正常的,因?yàn)槟愕腉PU刷新會(huì)比屏幕刷新快,在這種情況下,當(dāng)屏幕刷新成功,你的GPU將會(huì)等待VSYNC信號(hào),直到下一個(gè)VSYNC信號(hào)到來(lái)時(shí)(即屏幕刷新時(shí)),這時(shí)你的幀速率就可以達(dá)到設(shè)備的刷新率上限. 當(dāng)然這只是理想情況, 當(dāng)fps達(dá)到60的時(shí)候,GPU需要在16.66ms內(nèi)準(zhǔn)備好一幀,這對(duì)應(yīng)用程序的要求是非常高的.更不用說(shuō)100fps了...
-
屏幕刷新率比幀速率快的情況
如果屏幕刷新率比幀速率快,屏幕會(huì)在兩幀中顯示同一個(gè)畫(huà)面,當(dāng)這種斷斷續(xù)續(xù)的情況發(fā)生時(shí),你就遇到麻煩了.比如你的幀速率比屏幕刷新率高的時(shí)候,用戶看到的是非常流暢的畫(huà)面, 但是幀速率降下來(lái)的時(shí)候(GPU繪制太多東西的時(shí)候),用戶將會(huì)很明顯地察覺(jué)到動(dòng)畫(huà)卡住了或者掉幀,然后又恢復(fù)了流暢.這通常會(huì)被描述為閃屏, 跳幀,延遲.屏幕刷新率比幀速率快你的應(yīng)用程序應(yīng)該避免這些幀率突降的情況.以確保GPU迅速獲取數(shù)據(jù),并在屏幕再次刷新之前寫(xiě)錄內(nèi)容.
Perf Matters
keep calm, profile your code, and always remember, Perf Matters