
作為一個專業web後端開發,非常業餘遊戲愛好者,普通硬體退燒者,雖然對遊戲研發一竅不通,想對遊戲性能的問題探讨下。
第一個問題,近幾年為什麼遊戲主旋律都在GPU的選擇上,而往往都是CPU能力過剩,難道CPU就沒有壓榨的空間?
先拿吃雞遊戲舉例,引用一張評測文章裡的CPU與顯示卡不同組合配置的大逃殺benchmark圖:
可以看到搭載了GTX 1080+i5 7500(4核4線程 3.4GHz)的配置跑分比GTX1070+i7 7700k(4核8線程 4.2GHz)高,說明此配置中顯示卡仍是決定因素。
而使用的CPU 與 顯示卡的詳細參數如下
為什麼會這樣?先了解下常見的遊戲引擎,有助于了解其中的原因。
我對遊戲引擎不太了解,先找公開的資料。兩大遊戲引擎之一的Unity,代碼開源,文檔齊全,先從文檔了解他涉及的功能。
2D
Graphics
Physics
Scripting
Multiplayer and Networking
Audio
Animation
Timeline
UI
Navigation and Pathfinding
Unity Services & Dashboard
XR
Open-source repositories
是以引擎包括了
2D : 顧名思義
圖形: 主要有燈光,錄影機,材質,貼圖。
實體: 主要控制遊戲世界物體相關的互動,如碰撞。
腳本: 提供對引擎建立的遊戲對象的控制,觸發遊戲事件,響應使用者輸入。
多人與網絡: 提供對網絡遊戲支援。
音頻: 音效必不可少,還提供聲源定位等。
動畫: 又是個無須解釋的。
時間線: 常用來處理我們常說的過場動畫。
UI: 定義遊戲界面,玩家最長時間觀看的地方。
導航與路徑尋找: 定義遊戲對象的導航點。
Unity服務&儀表闆: 跟web後端一樣,管理者的控制台,觀看各種遊戲資料。
XR: 提供VR/AR支援。
可以猜測遊戲主入口的方法會加載以上功能元件,圖形/實體/網絡/腳本 層次上不相關,都可以在各自線程進行工作。
廣義上的遊戲,無論是單機遊戲還是網絡遊戲,其主要的處理層面是在玩家與遊戲中實體世界中各種事件的互動處理上。作為遊戲效果的直接展現上,3D遊戲中的貼圖與實時多邊形渲染是一個主要值得優化的性能點。
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負載對比圖:
降低了單核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使用方式也才剛剛開始普及,應用層比底層設施還是要遲緩的多。
參考内容:
<a href="https://msdn.microsoft.com/zh-cn/communitydocs/game-development/directx-12-white-paper/ta15073006">https://msdn.microsoft.com/zh-cn/communitydocs/game-development/directx-12-white-paper/ta15073006</a>
<a href="https://docs.unity3d.com/Manual/Shaders.html">https://docs.unity3d.com/Manual/Shaders.html</a>
<a href="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">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</a>