生存RTS《異星前哨》技術分享——燃燒你的CPU

遊資網發表於2023-01-09
大家好,我們是雲蟾遊戲國產科幻生存RTS《異星前哨》專案組成員,是一群熱愛RTS的老炮兒。在不久前我們在遊戲發售之際,分享了一些關於GPU的知識,這次我們會分享CPU相關的技術積累,希望給國內遊戲的開發環境提供一些微末幫助。

生存RTS《異星前哨》技術分享——燃燒你的CPU

在對《異星前哨》製作人的要求:同屏十萬只怪進行技術拆解後,技術組的效能最佳化方案,圍繞GPU和CPU兩個模組來同步進行的,本篇日誌主要來談談CPU的部分,與GPU不同,CPU承受的大部分壓力在於:

海量的蟲子尋路時產生的效率問題

基於這個關鍵點,我們將在下面分享CPU層面最佳化《異星前哨》的整個過程。

一、尋路演算法的問題

開發初期,技術組分析了產品的地圖需求:

1、遊戲開始時建立隨機地形

2、定時在多角落刷10萬隻若干蟲子,向地圖中心移動

3、角色、蟲子都要有碰撞

這些需求看起來並不複雜,公司在另一個專案《鐵甲雄兵》上已經積累了比較豐富的地圖開發經驗,所以技術組很快得到了初步方案結論,即:

使用“導航網格(Navigation Mesh)”技術

生存RTS《異星前哨》技術分享——燃燒你的CPU

依靠已有經驗來看,導航網格可以完美適配複雜、不規則、多層的地形,在尋路效率和效果上,都表現得非常優秀。

但是,當第一個DEMO出來時,問題就開始暴露:

隨著建築、單位、蟲子數量的不斷增加,FPS開始出現大範圍的跳動,連角色行走路線也變得飄忽不定,整個遊戲透露出奇怪的BUG感(誤)。

經過了漫長而脫髮的Debug流程,我們最終得到了結論,導航網格這玩意兒在《異星前哨》的地圖上,根!本!不!適!用!

先談談導航網格為什麼不適用,相較於傳統尋路方案,導航網格的優勢是:

‒        對網格進行合併,減少網格數量,減少計算量,提升效率

‒        利用三角形貼合不規則的地形,讓拐彎更自然

而帶來的缺點是:重構網格相當費時,耗費的時間和地圖的阻擋複雜度成正比

我們再來看《異星前哨》這個產品裡,產品的執行邏輯如下:

1、玩家會頻繁的擺放/拆除建築

2、地圖阻擋屬性因為建築變動而變更

3、開始重構導航網格,重新定位蟲子所在的三角網格

4、開始廢棄舊的尋路路徑,蟲子開始重新尋路

5、效能逐漸被拖垮

生存RTS《異星前哨》技術分享——燃燒你的CPU

我們透過上述的例子會發現,導航網格這種地圖型別:

地形不規則、阻擋幾乎不變。

比如,一個MMORPG的副本,導航網格允許離線生成,相對較為靜止

生存RTS《異星前哨》技術分享——燃燒你的CPU

但遺憾的是,在《異星前哨》這種即時戰略類遊戲中,情形剛好相反:

地形非常規則,阻擋頻繁變動。

生存RTS《異星前哨》技術分享——燃燒你的CPU

無奈之下,資深程式設計師在一個月黑風高的加班之夜,撫摸著自己僅剩的幾縷頭髮,在報告PPT上寫道:放棄使用導航網格尋路,改用傳統網格尋路。

二、傳統網格演算法

傳統網格就是我們常說的A星演算法,對於做了多年開發的技術組來說幾乎輕車熟路

使用A星(A-star algorithm)演算法

生存RTS《異星前哨》技術分享——燃燒你的CPU

當玩家擺放建築時,只需要更新該建築所佔網格的阻擋屬性,剩下的工作就由強大的A*演算法自行解決。

生存RTS《異星前哨》技術分享——燃燒你的CPU

一般情況下,一次尋路所消耗的時間不足1毫秒。

新的尋路模組編碼工作結束後,專案再次開展了一次深度測試。

一路穩定執行,配合上GPU的最佳化,整體執行的FPS穩定在80。

直到蟲巢發生暴動。

生存RTS《異星前哨》技術分享——燃燒你的CPU

數千只蟲子相互擁擠在路口,相互碰撞,大量蟲子被擠出原有尋路路線,他們很快開始重新尋路。

偏離路線的蟲子數量越來越多,FPS也急劇下降到了10。

顯然,單次尋路消耗時間雖然少,但也架不住數量的增加,最佳化尋路效率並不能從根本上解決問題。

技術組亮出第一把武器:多執行緒尋路

利用CPU多核優勢,成倍提升計算力,FPS明顯回升。

隨著蟲子數量的持續增加,FPS再次回落。

技術組亮出第二把武器:採用佇列來削峰

尋路佇列的本質,是把大量的尋路計算,分散到不同的幀上執行,設定一個合適的並行數量,將剩餘的尋路請求丟進快取等待,控制每一幀的計算量,利用時間消化掉所有的尋路請求,穩定FPS。

當碰到提交的尋路請求源源不斷的時候,自然會掉進快取佇列數量只增不減的黑洞。

所以技術組很快發現儘管幀數穩定了,但另一個問題愈加嚴重,出現了“成片蟲子原地呆滯”的現象

生存RTS《異星前哨》技術分享——燃燒你的CPU

儘管對自信心打擊很大,但這裡的問題非常明確:

海量蟲子的併發尋路存在很大問題,必須解決!

三、選擇洋流圖方案

技術組重新回到第一步,分析產品的地圖需求,經過多次的討論,意外發現了一個突破口:

《異星前哨》蟲潮爆發時有一個特點,所有怪物的目的地只有1個,就是主基地。

基於這個特點,我們的目光逐漸轉移到了一個不常用的方案上:

使用“洋流圖尋路法”Flow Field Pathfinding

生存RTS《異星前哨》技術分享——燃燒你的CPU

這個方案的特點:地圖上的每一個網格,都記錄了前進的方向,避免大範圍的遍歷計算。

蟲潮衝鋒的時候,目的地只有主基地,非常簡單粗暴,而且,玩家本身無法改變地形,玩家建造的建築物只產生阻擋,並不影響蟲潮的進攻路線。

所以,洋流圖在地圖生成的初期即可確定下來,無需在玩家遊戲過程中動態生成。

靜態生成,避免大範圍遍歷網格,簡直是量身定做

同時,技術組還考慮到:為了降低難度,避免蟲子分流,在生成洋流圖時最佳化了部分路線,使蟲子儘可能不會到處亂跑,更容易擠在一個小路口供玩家戰鬥。

另外,洋流圖還支援多層結構,可以支援更復雜的尋路機制,有更好的擴充性。

之後還會做更多最佳化,針對蟲群出現的位置,將蟲群看成一個整體,最佳化前進路線,重算洋流圖,讓蟲群的進攻看起來更加飽滿、有壓迫感。

蟲子滿載,CPU滿載,幀數穩定

生存RTS《異星前哨》技術分享——燃燒你的CPU

上述就是《異星前哨》技術組對遊戲CPU效率最佳化的總結了,希望大家的CPU不會太熱。

關於遊戲:

《異星前哨》是一款融合即時戰略的國產科幻生存RTS,不同於傳統RTS遊戲,本作捨棄了PVP對戰,將核心玩法聚焦於生存模擬。玩家將成為探索外星的領導者,建立基地並抵禦外星蟲潮的攻勢。遊戲首創英雄體系融入核心玩法,每個英雄擁有專屬技能、兵種以及建築單位等;數萬蟲潮同屏效果震撼,可暫停和隨時存檔。誠邀各位體驗!

相關文章