大牛能回答一下這些遊戲幀數有關的問題嗎?

1)遊戲幀數在60以下的時候是否需要開啟vsync?如果開啟會帶來什麼樣的影響?

在國外論壇看到有人提起會引起frame stutter,有人能具體解釋一下這個是怎麼回事嗎?

2)畫面撕裂的現象是不是只會出現在幀數大於60的情況中(顯示器60hz)?我有一個遊戲一般玩起來也只有30幀不到,為什麼還會有畫面撕裂?是怎麼引起的?

3)當遊戲幀數無法被60整除的時候,刷新率與幀率的關係又是怎樣的呢?

比如60幀時,一赫茲對應一幀,也即顯示器上一幅圖就是遊戲一幅圖

60幀時,兩赫茲對應一幀,即顯示器上兩幅圖是遊戲一幅圖

但是當幀數是45幀時呢?此時即顯示器上4幅圖對應遊戲三幅圖,但是具體對應關係是怎樣的呢?是AABC,還是ABBC,還是ABCC呢?

以及其他幀數時的情況,比如20~30幀時的情況

=====

4)承接第三問,是否因為顯示器刷新的原因才限制了遊戲幀數的選擇性。假如說一個顯示器刷新率是96hz,是否可以在不影響觀感的情況下遊玩48fps的遊戲?


你的這些問題都可以歸結到一起。就是幀緩存被讀取的時候,只要沒畫完,就都可能會撕裂。

比如你說你就是60FPS,但是可能你每一幀都沒合上拍子,那就沒用。


先解釋一下基礎知識。VSync雖然現在有很多更高級的技術,但基本實現的方法都是一樣——先把畫面渲染完,然後再貼到顯示幀緩衝里。沒有VSync的時候,畫面直接渲染到幀緩衝,同時顯卡也在從幀緩衝里拿數據顯示到顯示器,由於渲染往往比顯示慢,於是常常沒有完全渲染完的畫面就被顯示出來了,就導致畫面撕裂——顯示的一幀中可能包含渲染的兩幀中的各一部分。

然後一個個問題回答:

1)遊戲幀數在60以下的時候是否需要開啟vsync?如果開啟會帶來什麼樣的影響?

如果你觀察到了明顯的畫面撕裂,就需要。開啟了就不撕裂了。當然還會有一些其他的影響,底下針對你的問題回答。

在國外論壇看到有人提起會引起frame stutter,有人能具體解釋一下這個是怎麼回事嗎?

這主要是VSync的實現方式導致的。容易想到,顯示器的刷新率是不好變的,60Hz就是60Hz,以前也沒有技術去變。那麼如何實現每次都是畫面渲染完再顯示到顯示器呢?只好讓渲染去等顯示器了。舉個例子,比方說我渲染一幀需要1.5次刷新的時間,那麼在顯示器刷新第一次的時候畫面沒有變,第二次變了顯示出在1.5次刷新時渲染的畫面,然後第三次又變了顯示出在第3次刷新時渲染完成的畫面,然後第四次刷新畫面又不變了因為此時沒有渲染完成的畫面……如此就導致你看到的畫面不動-&>動-&>動-&>不動-&>動-&>動-&>不動-&>動-&>動-&>不動…………

而且要注意的是,你在每個第二次刷新的時候看到的是第1.5次刷新時渲染的畫面,也就是說第二、三次刷新之間你看到的渲染畫面體現的時間變化比實際過去的時間長,更加劇了這個畫面變化的時間上的不均勻性。這就是Frame stutter了。

2)畫面撕裂的現象是不是只會出現在幀數大於60的情況中(顯示器60hz)?我有一個遊戲一般玩起來也只有30幀不到,為什麼還會有畫面撕裂?是怎麼引起的?

不是。根據開頭的基礎知識,如果你運氣夠背每次畫面刷新都正好在渲染到一半的時候,那麼你每次都會看到撕裂的畫面。

事實上,一般來說如果你的渲染速度受到性能的限制,你幾乎一定會看到撕裂。因為渲染很難在刷新時正好完成一幀,多數時候刷新時渲染都只進行到一幀的一部分。

3)當遊戲幀數無法被60整除的時候,刷新率與幀率的關係又是怎樣的呢?

比如60幀時,一赫茲對應一幀,也即顯示器上一幅圖就是遊戲一幅圖

60幀時,兩赫茲對應一幀,即顯示器上兩幅圖是遊戲一幅圖

同上一問,就算你的渲染速度和刷新率都是60Hz,你仍然有很大可能看到撕裂,比方說刷新正好和渲染錯開了半個幀的時間,那你每次看到的畫面都將是上下在不同幀的。倍數關係的時候類似,你仍然有可能運氣不好結果每次整倍數刷新的時候仍然錯開了渲染完成時間,導致你始終看到的都是撕裂的畫面。

但是當幀數是45幀時呢?此時即顯示器上4幅圖對應遊戲三幅圖,但是具體對應關係是怎樣的呢?是AABC,還是ABBC,還是ABCC呢

以及其他幀數時的情況,比如20~30幀時的情況

我猜你想問的是渲染速度45FPS,而刷新率60Hz?

還是上面的答案,取決於你的運氣。

你要意識到,渲染髮生的時間不是按照刷新率來定的,最小時間單位不是一次刷新時間,所以很可能渲染周期和刷新周期恰好差開了幾分之一個刷新周期,導致總是產生畫面撕裂。

如果假設兩個周期同步了,那麼這種情況下你看到的畫面是AABCD(從0時間開始5個採樣點的畫面,跨越4個刷新時間)。

4)承接第三問,是否因為顯示器刷新的原因才限制了遊戲幀數的選擇性。假如說一個顯示器刷新率是96hz,是否可以在不影響觀感的情況下遊玩48fps的遊戲?

根據以上答案,沒有這樣的關係。

假如我們不考慮顯示器刷新率所帶來的問題,30~60幀到底是什麼感受呢

另外,為什麼視頻播放受顯示器刷新率的影響沒有這麼大呢?我看視頻也有48幀格式的情況

這兩個問題可以一起回答。簡單說,雖然人眼看超過24幀的畫面就感覺是連續的,但是這裡有兩個隱藏條件——1、畫面變化必須夠小,反例你可以想像一下高速閃爍的紅藍畫面,120Hz以下你看到的不可能是紫色;2、刷新速率必須穩定,同樣是24fps,如果前半秒刷新1幀後半秒刷新23幀肯定看起來不是連續的。

所以假設這麼一台完美設備,它畫面更新率可以30fps也可以60fps,那麼如果它的動畫變化足夠小,即使30fps你看到的畫面也是細膩流暢的。如果有些畫面變化特別大,那麼有可能需要將速度提升到一定程度,比方說60fps,使得相鄰兩幀變化小到讓人感覺到是連續的。

這也是播放視頻為什麼刷新率沒有感覺的原因,一來視頻播放的刷新率比較穩定,二來視頻本身對於變化已經做了模糊,所以畫面變化顯得流暢。這也是為什麼很多遊戲開啟VSync之餘還提供了「Motion Blur」的效果。


@沈萬馬說的大部分就是原因了,補充一個細節。

「沒有VSync的時候,畫面直接渲染到幀緩衝,同時顯卡也在從幀緩衝里拿數據顯示到顯示器。」

應該不是這樣,現在正常的渲染流水線里,不管有沒有VSync,渲染都是渲染到後備緩衝區,然後被貼(或交換)到真正的顯示緩衝區里。(按照我的理解,全屏是交換,窗口模式是「貼」)

不然的話,你看到的就不是偶爾出現的撕裂,而是很明顯的畫面上處於前景的物體在閃爍。

早期ddraw/GDI/甚至是DOS遊戲編程的時候有很多初學者都會犯這樣的錯誤。

應該是貼或者交換的過程 剛好是顯示器刷新的時刻。


推薦閱讀:

手機遊戲上線前需要做什麼準備?
怪物獵人為什麼會帶一隻貓去打獵?
如何評價《熹妃傳》這款手游?
為什麼人們會覺得買正版遊戲是一種奢侈的行為?
在steam上買正版遊戲是種什麼樣的信仰?

TAG:遊戲 | 遊戲開發 | 顯卡 |