非專業遊戲CPU多核效能研究

時序發表於2018-02-27

image.png

作為一個專業web後端開發,非常業餘遊戲愛好者,普通硬體退燒者,雖然對遊戲研發一竅不通,想對遊戲效能的問題探討下。

遊戲效能與多核CPU的疑問

第一個問題,近幾年為什麼遊戲主旋律都在GPU的選擇上,而往往都是CPU能力過剩,難道CPU就沒有壓榨的空間?

先拿吃雞遊戲舉例,引用一張評測文章裡的CPU與顯示卡不同組合配置的大逃殺benchmark圖:

image.png

可以看到搭載了GTX 1080+i5 7500(4核4執行緒 3.4GHz)的配置跑分比GTX1070+i7 7700k(4核8執行緒 4.2GHz)高,說明此配置中顯示卡仍是決定因素。

而使用的CPU 與 顯示卡的詳細引數如下

image.png

image.png

遊戲引擎

為什麼會這樣?先了解下常見的遊戲引擎,有助於瞭解其中的原因。

我對遊戲引擎不太瞭解,先找公開的資料。兩大遊戲引擎之一的Unity,程式碼開源,文件齊全,先從文件瞭解他涉及的功能。

  • 2D
  • Graphics
  • Physics
  • Scripting
  • Multiplayer and Networking
  • Audio
  • Animation
  • Timeline
  • UI
  • Navigation and Pathfinding
  • Unity Services & Dashboard
  • XR
  • Open-source repositories

所以引擎包括了

2D : 顧名思義
圖形: 主要有燈光,攝像機,材質,貼圖。
物理: 主要控制遊戲世界物體相關的互動,如碰撞。
指令碼: 提供對引擎建立的遊戲物件的控制,觸發遊戲事件,響應使用者輸入。
多人與網路: 提供對網路遊戲支援。

image.png

音訊: 音效必不可少,還提供聲源定位等。
動畫: 又是個無須解釋的。

image.png

時間線: 常用來處理我們常說的過場動畫。
UI: 定義遊戲介面,玩家最長時間觀看的地方。

image.png

導航與路徑尋找: 定義遊戲物件的導航點。

image.png

Unity服務&儀表板: 跟web後端一樣,管理員的控制檯,觀看各種遊戲資料。

image.png

XR: 提供VR/AR支援。

可以猜測遊戲主入口的方法會載入以上功能元件,圖形/物理/網路/指令碼 層次上不相關,都可以在各自執行緒進行工作。

廣義上的遊戲,無論是單機遊戲還是網路遊戲,其主要的處理層面是在玩家與遊戲中物理世界中各種事件的互動處理上。作為遊戲效果的直接體現上,3D遊戲中的貼圖與實時多邊形渲染是一個主要值得優化的效能點。

DirectX

DX12是隨WIN10搭載的,針對現代多核CPU提供了優化。主要是下沉了API提供的基礎功能,更貼近硬體,當然這樣開發者需要管理更多的CPU與GPU的同步問題,以前在DX11中是隱含在runtime時進行處理的,DX12中對此的介紹:

圖形渲染是現代3D遊戲的主要任務之一。在DirectX 9中,原則上所有渲染API都必須在一個執行緒中呼叫。DirectX 10/11中加強了多執行緒支援,但各執行緒的負載很不平衡,渲染相關負載主要集中在遊戲的主渲染執行緒和圖形驅動中,這使得渲染任務無法充分利用現代多核處理器的能力,經常成為遊戲渲染管線的主要效能瓶頸之一。

為了提高圖形渲染效率,在DirectX 12中,多執行緒得到了前所未有的支援。在重新設計的DirectX 12中,為了讓應用程式的圖形渲染可以達到最大的多核CPU的使用效率:一方面,DirectX 12儘可能地預處理和複用渲染命令,降低渲染狀態的切換開銷,提升渲染API在CPU和GPU上的處理效率;另一方面,為應用程式提供了更高效的多執行緒渲染機制,允許應用程式最大程度地利用多工獲得效能提升。通過使用多執行緒手段可以使圖形驅動在CPU端的開銷降低,同時也使GPU的工作效率顯著提升。DX12的多執行緒機制除了使渲染任務能更均衡地並行執行在不同的處理器核上以提升效能,還能降低CPU的功耗,這對移動平臺上的遊戲也非常重要。

從原文介紹可以看出,由於3D場景渲染工作是由CPU提交給GPU進行的,首先GPU要能在短時間內完成運算,在此基礎上如果GPU有富裕,我們希望能讓CPU開啟多執行緒提交更多的任務給GPU進行運算。

據瞭解畫圖渲染的過程是程式向顯示卡提交一個Draw:App->DX runtime->User mode driver->dxgkrnl->Kernel mode driver->GPU ,到GPU前的工作量都在CPU, DX12的設計目的是減少中間層,提高效率。

基於此,參考以下使用了DX11與DX12的CPU負載對比圖:

image.png

image.png

降低了單核CPU的負載,平攤了一部分任務到其他核上,比DX11時8核有2核完全沒用上有改善。

看一下最近流行的吃雞最低配置:
處理器:i3-4340 / AMD FX-6300
顯示卡:GeForce GTX 660 / Radeon HD 7850
DirectX : 11

DX11顯然是個問題,軟體總是落後於硬體更新的,硬體架構升級後,上層的作業系統才會開始適配,然後是作業系統之上,應用層的遊戲引擎。

再看看DOTA2, 還在使用DirectX 9c。

遊戲引擎需要使用作業系統提供的新的硬體層的抽象API,封裝層高層API供開發者使用。

至少基於Unity3D的產品顯然還沒有升級。

顯然與Web產品一樣,JDK已經開始釋出10了。還有大量的遺留產品在使用JDK6。JDK8的lambda使用方式也才剛剛開始普及,應用層比底層設施還是要遲緩的多。

參考內容:

https://msdn.microsoft.com/zh-cn/communitydocs/game-development/directx-12-white-paper/ta15073006

https://docs.unity3d.com/Manual/Shaders.html

https://segmentfault.com/img/bV3ZNqhttps://segmentfault.com/img/bV3ZL8https://segmentfault.com/img/bV3ZMahttps://segmentfault.com/img/bV3ZMbhttps://segmentfault.com/img/bV3ZMchttps://segmentfault.com/img/bV3ZMdhttps://segmentfault.com/img/bV3ZMf


相關文章