許多 PC 游戲都圍繞 8 核游戲機進行設計,并假設其軟件線程系統在所有 PC 上都“正常工作”,尤其是在工作線程池中的線程數量方面。不久前,大多數 PC 的核心數量與游戲機相似時,這是一個合理的假設:CPU 的速度更快,性能只是擴展。
但近年來,CPU 格局發生了變化,現在有一個復雜的性能變量矩陣需要導航:
- 核心數量增加
- Intel 推出的異構 P/E 核心
- AMD 的非對稱緩存
- 更復雜的調度算法
- Microsoft 等操作系統供應商提供的電源管理技術
這種復雜性意味著先前的線程計數確定算法(及其衍生算法)已不再足夠:
num_worker_threads = num_logical_cores - 2 |
這種傳統的線程數量確定算法基于邏輯核心數量,并為關鍵線程保留了兩個核心。
當核心數量超過某個點時,許多受 CPU 限制的游戲實際上會降低性能,因此額外線程并行性的優勢會被開銷所抵消。
例如,在擁有 8 個以上物理核心的高端桌面系統中,一些游戲通過將其工作池的線程數量減少到 CPU 核心數量,可實現高達 15%的性能提升。
造成性能下降的原因十分復雜且多種多樣。如果一款游戲的性能下降 10%,另一款游戲在同一系統上的性能就會提升 10%,這就凸顯了在所有游戲和所有系統中提供一刀切解決方案的難度。
相反,游戲的線程數量應根據工作負載量身定制。輕量級 CPU 工作負載應使用更少的線程。
性能解決方案
如果您的游戲在核心數較高的機器上的性能未按預期擴展,甚至可能會降低其性能,則可能存在以下常見原因:
- 硬件性能:核心數較高的 CPU 有時會降低 CPU 速度。減少線程數量可以提高活動核心的頻率。
- 硬件資源爭用:減少線程數量通常可以減輕內存子系統的壓力,減少延遲并提高 CPU 緩存的效率,特別是在沒有統一 L3 緩存的基于小芯片的架構中。在不同的小芯片上執行線程會導致高緩存抖動。
- 在單個物理核心的兩個邏輯核心(超線程或同步多線程)上執行線程會增加延遲,因為兩個線程必須共享物理資源(緩存、指令管線等)。如果關鍵線程共享物理核心,則其性能可能會下降。針對物理核心數量而不是邏輯核心數量,有助于在核心數量更大的系統上減少延遲。
- 軟件資源競爭:當多個線程同時訪問時,鎖和原子操作會有更高的延遲,這會增加內存壓力。錯誤共享會使這種情況更加嚴重。
- 操作系統調度問題:線程對活動核心的超額訂閱會導致大量上下文交換,這可能會非常昂貴,并可能給 CPU 內存子系統帶來額外壓力。
- 在具有 P/E 核心的系統上,工作將首先調度到物理 P 核心,然后是 E 核心,最后是超線程邏輯 P 核心。通過使用比總物理核心更少的線程,可以在 E 核心上執行后臺線程(例如操作系統線程),而不會中斷在 P 核心上運行的關鍵線程。具體方法是在其兄弟邏輯核心上執行。
- 電源管理:減少線程數量可以使更多核心保持活動狀態,從而節省電量,并可能允許剩余核心以更高的頻率運行。
- 核心停用對高線程數量很敏感,這會導致短時間爆發的線程無法觸發啟發式取消核心停用的的問題。運行時間越長,線程越少有助于核心停用算法。
此擴展問題有多種解決方案,具體取決于問題的根本原因:
- 線程數量的動態負載均衡
- 可隨核心數量擴展的無鎖定線程模型
- 使用 QoS 和線程優先級 API 幫助將線程引導到特定核心
- 其他解決方案 … …
最簡單的方法可能是找到游戲實際需要的線程數量,然后讓操作系統有效地調度線程。
圖 1 顯示,減少游戲使用的線程數量可能會減少部分開銷(通常來自關鍵線程),這可能會直接提高游戲性能。

在不同的系統上以不同的設置和線程數測試您的游戲。您可能會發現線程計數的最佳點或適合您游戲的少量最佳點。
請務必測試超線程,以確定在列舉不同系統上的線程時,您是否應與物理核心或邏輯核心保持一致。超線程通常有助于低核心數量系統,這些系統沒有足夠的物理核心來高效執行工作負載,但可能會影響更大的核心數量系統的性能。
您的測試可能會生成經修改的算法,您可以在其中定制max_thread_count
修改了以下線程數量確定算法,將線程數量限制在預定義的最大值內:
max_thread_count = ini_file.get(“max_thread_count”) num_worker_threads = num_logical_cores - 2 if (num_worker_threads > max_thread_count ) num_worker_threads = max_thread_count |
如果max_thread_count
已添加到您的游戲 。ini 文件中,您的 IHV 合作伙伴、QA 團隊和游戲玩家都可以輕松找到適合自己 PC 設置的線程數量,以確保實現更高的性能。
總結
CPU 性能問題和工作線程數量是性能方程中不可或缺的一部分。在 CPU 矩陣上測量游戲的 CPU 性能并調整線程數量以適應工作負載是簡單的優化,可以產生巨大的兩位數性能提升。
在 .ini 文件中覆蓋線程數,可確保游戲玩家找到合適的值,從而更大限度地提高 PC 性能。
?