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

2021-07-06 09:02:44 字數 3454 閱讀 2676

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

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

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

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

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

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

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

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

*****

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

分享

按投票排序

按時間排序

葉浩標、

知乎使用者、

知乎使用者

等人贊同

先解釋一下基礎知識。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幀到底是什麼感受呢
這兩個問題可以一起回答。簡單說,雖然人眼看超過24幀的畫面就感覺是連續的,但是這裡有兩個隱藏條件——1、畫面變化必須夠小,反例你可以想象一下高速閃爍的紅藍畫面,120hz以下你看到的不可能是紫色;2、重新整理速率必須穩定,同樣是24fps,如果前半秒重新整理1幀後半秒重新整理23幀肯定看起來不是連續的。

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

編輯於 2014-11-14

感謝分享

收藏•沒有幫助•舉報

贊同8反對,不會顯示你的姓名

沒有人、

知乎使用者、

知乎使用者

等人贊同

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

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

發布於 2014-11-12

感謝分享

收藏•沒有幫助•舉報

• 贊同

3

反對,不會顯示你的姓名

沒有人、

知乎使用者、

知乎使用者

贊同

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

「沒有vsync的時候,畫面直接渲染到幀緩衝,同時顯示卡也在從幀緩衝裡拿資料顯示到顯示器。」

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

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

早期ddraw/gdi/甚至是dos遊戲程式設計的時候有很多初學者都會犯這樣的錯誤。

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

編輯於 2014-11-17

感謝分享

收藏•沒有幫助•舉報

有益的,回答一下 GO

1 下列程式定義了乙個calc add類,請寫出程式的執行結果。public class calc add system.out.print sum sum 執行結果為 2 請寫出程式的執行結果。class person public int getweight public int getheig...

請你回答一下fork和vfork的區別

fork 建立乙個和當前程序映像一樣的程序可以通過fork 系統呼叫 include include pid t fork void 成功呼叫fork 會建立乙個新的程序,它幾乎與呼叫fork 的程序一模一樣,這兩個程序都會繼續執行。在子程序中,成功的fork 呼叫會返回0。在父 程序中fork 返...

Mark一下進製轉換的問題

關於手工進行進製轉換,一般都是用二進位製做跳板。常規進製 二進位制 八進位制 十進位制 十六進製制。1.十進位制 二進位制 十進位制數除2,餘數作為結果,商繼續除,直到除完為止。所有餘數從低位到高位,排列產生二進位制數。最後有商為1,放到最高位。十進位制5 5 2 2.1 2 2 1.0 二進位制5...