遊戲卡頓幀數低?PCIe 帶寬可能纔是元兇

前言

在開始之前先聲明一下,我看底下評論好像有點不大對勁,本文面向的是PCIe故障導致的PCIe帶寬嚴重瓶頸的現象,例如PCIe 因爲硬件故障縮水到3.0 x2 3.0x4等情況。正常情況下就算用PCIe3.0 x8也很難滿足本文的條件

友軍先別開火,我不是賣 PCIe 5.0 板子的,也不是說不用 PCIe 5.0 就會有性能損失的無良商家,我只是一個科普 PCIe 知識的

起因是最近在黑盒看到一些盒友說自己遊戲幀數低,內存硬盤顯卡CPU全查了一遍一點問題沒有,跑分測試和甜甜圈也沒問題,但是比同配置的人卡很多,這種情況一般就是 PCIe 帶寬不足或者連接問題導致的。

那麼,PCIe 帶寬不足導致的遊戲卡頓症狀有哪些呢?這裏列出幾個

  • GPU和CPU負載都不高,平均幀還行,但1% LOW幀沒眼看

  • 一到換場景或者BOSS換階段就特別卡

  • TimeSpy和Furmark測試基本正常,看不出問題

如果你有以上症狀,並且其他組件已經基本查了一遍,那麼就要懷疑是不是 PCIe 帶寬瓶頸了

爲什麼會這樣呢?

原理

我們先來解釋一下原因,知道了原因纔好解決這個問題,而且遇到類似問題也更好分析原因和解決

首先,這裏是一個現代 PC 數據流動的極簡流程圖(肯定是不嚴謹,但是好理解):

一個簡化了一切總線和南北橋的示意圖

當你的電腦渲染一幀畫面時,在上圖中的數據大致經歷瞭如下流動:

  1. CPU 向硬盤請求讀取需要渲染的畫面內容

  2. 硬盤將數據寫入內存後通知 CPU

  3. CPU 根據數據計算需要渲染的內容具體有哪些,怎麼渲染,用哪些資源

  4. CPU 把計算得到的結果寫入內存,通知顯卡讀取並執行

  5. 顯卡通過 PCIe 總線讀取內存,將執行內容和有關資源寫入顯存

  6. GPU 核心從顯存中獲取執行內容和資源,渲染畫面並輸出

經歷如上 6 步,你的 GPU 成功輸出了一幀畫面如果一直這樣效率肯定高不了,所以第二次執行時,流程會變爲:

  1. CPU 從內存或緩存中得到需要渲染的內容具體有哪些,怎麼渲染,用哪些資源

  2. CPU 把計算得到的結果寫入內存,通知顯卡讀取並執行

  3. 顯卡通過 PCIe 總線讀取內存,將執行內容和顯存中不存在的資源寫入顯存

  4. GPU 核心從顯存中獲取執行內容和資源,渲染畫面並輸出

雖然是4步,看起來也很多,但現在你的遊戲就會流程很多了,因爲上述過程中最慢的是硬盤,其次是內存,最快的是顯存,現在硬盤直接休息了,內存也只需要讀取少量數據,顯卡幾乎只和顯存溝通,所以渲染能力大幅提升

那麼 PCIe 帶寬瓶頸會導致什麼問題呢?請看第一個流程的第5步:

顯卡通過 PCIe 總線讀取內存,將執行內容和有關資源寫入顯存

這一步有大量數據需要經過 PCIe 總線傳輸,而PCIe總線的速度是多少呢?

PCIe 4.0 x16 是單向 32GB/s,PCIe 5.0 x16 是 64GB/s

可以發現現代的 PCIe 總線一般能在幾十毫秒內完成這個任務,所以如果你的 PCIe 帶寬正常的話你不會有任何感知

但是假如你的 PCIe 帶寬存在問題,例如金手指接觸不良導致變成了 PCIe 4.0 x4,那麼此時的PCIe總線則需要幾百毫秒才能完成這個任務

看起來還是很短但是第一套流程在每次場景切換或者畫面大變化時都會進行一次,每次卡一下積少成多就卡了

但是這也不會很卡啊?

是的,如果只是這樣的確不會很卡,最多場景切換卡一下。但實際中問題遠比這要大,這是爲什麼呢?

因爲上述原理解釋建立在一個大前提上:你的顯卡顯存完全足夠加載並儲存所有內容,並且可被緩存的資源遠大於繪製指令

在當今這個 AI 時代,消費級顯卡的顯存比黃金還貴,這個前提的前半部分是很難成立的。並且這樣顯存中會存在大量用不到的冷數據,白白浪費顯存,怎麼辦呢?

把冷數據放到內存裏不就行了嗎

是的,這就是解決方法。在你的顯卡顯存即將不足時,遊戲不會直接崩潰,而是會主動把並非正在用的資源儘可能往內存裏面放,需要的時候再讀出來,讓顯卡使用。那麼讀取和寫入走的是哪個通道呢?

PCIe 總線

和上面的流程一樣,顯卡在 PCIe 傳輸的數據未完全就位之前是無法進行渲染的,只能空轉或者進行輔助工作等待傳輸完成,在這期間顯卡幾乎無法渲染輸出任何一幀,因此你的1% LOW 幀和GPU佔用會特別低,因爲顯卡根本就沒有工作可做,在等 PCIe 傳輸數據

我這裏用GPU-Z和某六字遊戲做了一下測試:

《六字:是個遊戲》測試內容

可以發現Bus interface load也就是PCIe總線負載程度是100%,其實這就是PCIe瓶頸但是我手裏這張卡已經是PCIe 5.0 x16了,瓶頸也沒辦法

這在網遊中非常常見,尤其是FPS類遊戲,因爲耗費 PCIe 帶寬的主要是CPU發送的繪製指令而非資源,而繪製指令無法被顯存緩存,只能依靠 PCIe 來回跑,帶寬低了指令傳不過去,顯卡就只能空轉等待傳輸完成

所以前提的後半部分在網遊中也很難滿足

當然,如果你主玩 3A 的話感知不會這麼明顯,但是 3A 容易爆顯存,還是得PCIe總線把資源從RAM拉到顯存再拉回去,還是會佔很多帶寬,剛好把前提的前半部分給否決了

那麼到現在,我們已經能完全推理出症狀的原因了:

  • PCIe 瓶頸導致 GPU 無法全力工作,導致平均幀數低,1% LOW 幀完全沒法看

  • 換場景時PCIe傳不過來,都給卡住了

第三點是因爲什麼呢,我們跑一個furmark看看:

furmark(我忘點RESET了,兩個擎天柱中間的是測試值)

可以發現全程只有開頭結尾PCIe跑滿了,中間的過程中平均值在15%,即使帶寬變爲原來的25%仍然不會出現卡頓,TimeSpy同理,因爲它們的目的都是測試顯卡本身,而非測試顯卡的綜合運行條件,PCIe帶寬作爲無關量被儘可能排除

排查和解決

說了半天原理,接下來來點乾貨,如何排查修復

首先你需要一個GPU-Z,下載下來之後打開它

這是我的

很複雜,但是我們不需要看那些,就看Bus interface這個值

如果這個值at符號的前後一致,證明你的顯卡PCIe沒有任何問題,如果不一致的話,我們分成兩類討論

但在討論之前,先明確PCIe版本應該是什麼值。正常而言,是如下內容取最小值:

  • 顯卡的物理金手指通道數和 PCIe 版本

  • 主板的 PCIe 版本和插槽支持通道數

例如你的顯卡是RTX 5060,支持PCIe 5.0 x8,主板支持PCIe 4.0 x16,最終顯卡應該運行在PCIe 4.0 x8上,你的at後面的值應該和這個值比較,而不是GPU-Z提示的值

版本低

如果是PCIe版本低(即這個小數小,如1.1或3.0)此時運行一個高負載程序,如遊戲或者furmark,運行中查看此參數是否變爲應變爲的值

如果不是,檢查主板中配置的 PCIe 版本是否爲最高,主板電氣性能是否存在問題

通道少

如果是通道少,那麼原因有很多:

  • 主板PCIe插槽拆分設置錯誤或未將顯卡安裝在推薦插槽

  • PCIe金手指接觸不良

  • CPU針腳損壞或本身損壞(你沒看錯,CPU損壞是一個原因)

  • 顯卡內部 PCB 損壞

根據對應情況自行排查

後記

這是本人第一次在小黑盒上發表文章,希望各位盒友們海涵,如果有事實性錯誤給我一個改正的機會

因爲本人不打FPS所以缺少FPS類的數據,FPS更容易出現PCIe瓶頸是根據網上的帖子反推的,可能存在問題

文章裏面對於PCIe速率的表達爲了保證簡明性直接使用了GB/s這個單位,實際中肯定會低於這個數

從文章內實驗結果來看,使用5060、5070和5080等顯存容量瓶頸更嚴重的GPU時應該搭配具有更高PCIe版本的主板,也許是板卡搭配的一個建議

另外盒友們的封面都是怎麼生成的,求教

更多遊戲資訊請關註:電玩幫遊戲資訊專區

電玩幫圖文攻略 www.vgover.com