生存RTS《異星前哨》技術分享——燃燒你的CPU
大家好,我們是雲蟾遊戲國產科幻生存RTS《異星前哨》專案組成員,是一群熱愛RTS的老炮兒。在不久前我們在遊戲發售之際,分享了一些關於GPU的知識,這次我們會分享CPU相關的技術積累,希望給國內遊戲的開發環境提供一些微末幫助。
在對《異星前哨》製作人的要求:同屏十萬只怪進行技術拆解後,技術組的效能最佳化方案,圍繞GPU和CPU兩個模組來同步進行的,本篇日誌主要來談談CPU的部分,與GPU不同,CPU承受的大部分壓力在於:
海量的蟲子尋路時產生的效率問題
基於這個關鍵點,我們將在下面分享CPU層面最佳化《異星前哨》的整個過程。
一、尋路演算法的問題
開發初期,技術組分析了產品的地圖需求:
1、遊戲開始時建立隨機地形
2、定時在多角落刷10萬隻若干蟲子,向地圖中心移動
3、角色、蟲子都要有碰撞
這些需求看起來並不複雜,公司在另一個專案《鐵甲雄兵》上已經積累了比較豐富的地圖開發經驗,所以技術組很快得到了初步方案結論,即:
使用“導航網格(Navigation Mesh)”技術
依靠已有經驗來看,導航網格可以完美適配複雜、不規則、多層的地形,在尋路效率和效果上,都表現得非常優秀。
但是,當第一個DEMO出來時,問題就開始暴露:
隨著建築、單位、蟲子數量的不斷增加,FPS開始出現大範圍的跳動,連角色行走路線也變得飄忽不定,整個遊戲透露出奇怪的BUG感(誤)。
經過了漫長而脫髮的Debug流程,我們最終得到了結論,導航網格這玩意兒在《異星前哨》的地圖上,根!本!不!適!用!
先談談導航網格為什麼不適用,相較於傳統尋路方案,導航網格的優勢是:
‒ 對網格進行合併,減少網格數量,減少計算量,提升效率
‒ 利用三角形貼合不規則的地形,讓拐彎更自然
而帶來的缺點是:重構網格相當費時,耗費的時間和地圖的阻擋複雜度成正比
我們再來看《異星前哨》這個產品裡,產品的執行邏輯如下:
1、玩家會頻繁的擺放/拆除建築
2、地圖阻擋屬性因為建築變動而變更
3、開始重構導航網格,重新定位蟲子所在的三角網格
4、開始廢棄舊的尋路路徑,蟲子開始重新尋路
5、效能逐漸被拖垮
我們透過上述的例子會發現,導航網格這種地圖型別:
地形不規則、阻擋幾乎不變。
比如,一個MMORPG的副本,導航網格允許離線生成,相對較為靜止
但遺憾的是,在《異星前哨》這種即時戰略類遊戲中,情形剛好相反:
地形非常規則,阻擋頻繁變動。
無奈之下,資深程式設計師在一個月黑風高的加班之夜,撫摸著自己僅剩的幾縷頭髮,在報告PPT上寫道:放棄使用導航網格尋路,改用傳統網格尋路。
二、傳統網格演算法
傳統網格就是我們常說的A星演算法,對於做了多年開發的技術組來說幾乎輕車熟路
使用A星(A-star algorithm)演算法
當玩家擺放建築時,只需要更新該建築所佔網格的阻擋屬性,剩下的工作就由強大的A*演算法自行解決。
一般情況下,一次尋路所消耗的時間不足1毫秒。
新的尋路模組編碼工作結束後,專案再次開展了一次深度測試。
一路穩定執行,配合上GPU的最佳化,整體執行的FPS穩定在80。
直到蟲巢發生暴動。
數千只蟲子相互擁擠在路口,相互碰撞,大量蟲子被擠出原有尋路路線,他們很快開始重新尋路。
偏離路線的蟲子數量越來越多,FPS也急劇下降到了10。
顯然,單次尋路消耗時間雖然少,但也架不住數量的增加,最佳化尋路效率並不能從根本上解決問題。
技術組亮出第一把武器:多執行緒尋路
利用CPU多核優勢,成倍提升計算力,FPS明顯回升。
隨著蟲子數量的持續增加,FPS再次回落。
技術組亮出第二把武器:採用佇列來削峰
尋路佇列的本質,是把大量的尋路計算,分散到不同的幀上執行,設定一個合適的並行數量,將剩餘的尋路請求丟進快取等待,控制每一幀的計算量,利用時間消化掉所有的尋路請求,穩定FPS。
當碰到提交的尋路請求源源不斷的時候,自然會掉進快取佇列數量只增不減的黑洞。
所以技術組很快發現儘管幀數穩定了,但另一個問題愈加嚴重,出現了“成片蟲子原地呆滯”的現象
儘管對自信心打擊很大,但這裡的問題非常明確:
海量蟲子的併發尋路存在很大問題,必須解決!
三、選擇洋流圖方案
技術組重新回到第一步,分析產品的地圖需求,經過多次的討論,意外發現了一個突破口:
《異星前哨》蟲潮爆發時有一個特點,所有怪物的目的地只有1個,就是主基地。
基於這個特點,我們的目光逐漸轉移到了一個不常用的方案上:
使用“洋流圖尋路法”Flow Field Pathfinding
這個方案的特點:地圖上的每一個網格,都記錄了前進的方向,避免大範圍的遍歷計算。
蟲潮衝鋒的時候,目的地只有主基地,非常簡單粗暴,而且,玩家本身無法改變地形,玩家建造的建築物只產生阻擋,並不影響蟲潮的進攻路線。
所以,洋流圖在地圖生成的初期即可確定下來,無需在玩家遊戲過程中動態生成。
靜態生成,避免大範圍遍歷網格,簡直是量身定做
同時,技術組還考慮到:為了降低難度,避免蟲子分流,在生成洋流圖時最佳化了部分路線,使蟲子儘可能不會到處亂跑,更容易擠在一個小路口供玩家戰鬥。
另外,洋流圖還支援多層結構,可以支援更復雜的尋路機制,有更好的擴充性。
之後還會做更多最佳化,針對蟲群出現的位置,將蟲群看成一個整體,最佳化前進路線,重算洋流圖,讓蟲群的進攻看起來更加飽滿、有壓迫感。
蟲子滿載,CPU滿載,幀數穩定
上述就是《異星前哨》技術組對遊戲CPU效率最佳化的總結了,希望大家的CPU不會太熱。
關於遊戲:
《異星前哨》是一款融合即時戰略的國產科幻生存RTS,不同於傳統RTS遊戲,本作捨棄了PVP對戰,將核心玩法聚焦於生存模擬。玩家將成為探索外星的領導者,建立基地並抵禦外星蟲潮的攻勢。遊戲首創英雄體系融入核心玩法,每個英雄擁有專屬技能、兵種以及建築單位等;數萬蟲潮同屏效果震撼,可暫停和隨時存檔。誠邀各位體驗!
在對《異星前哨》製作人的要求:同屏十萬只怪進行技術拆解後,技術組的效能最佳化方案,圍繞GPU和CPU兩個模組來同步進行的,本篇日誌主要來談談CPU的部分,與GPU不同,CPU承受的大部分壓力在於:
海量的蟲子尋路時產生的效率問題
基於這個關鍵點,我們將在下面分享CPU層面最佳化《異星前哨》的整個過程。
一、尋路演算法的問題
開發初期,技術組分析了產品的地圖需求:
1、遊戲開始時建立隨機地形
2、定時在多角落刷10萬隻若干蟲子,向地圖中心移動
3、角色、蟲子都要有碰撞
這些需求看起來並不複雜,公司在另一個專案《鐵甲雄兵》上已經積累了比較豐富的地圖開發經驗,所以技術組很快得到了初步方案結論,即:
使用“導航網格(Navigation Mesh)”技術
依靠已有經驗來看,導航網格可以完美適配複雜、不規則、多層的地形,在尋路效率和效果上,都表現得非常優秀。
但是,當第一個DEMO出來時,問題就開始暴露:
隨著建築、單位、蟲子數量的不斷增加,FPS開始出現大範圍的跳動,連角色行走路線也變得飄忽不定,整個遊戲透露出奇怪的BUG感(誤)。
經過了漫長而脫髮的Debug流程,我們最終得到了結論,導航網格這玩意兒在《異星前哨》的地圖上,根!本!不!適!用!
先談談導航網格為什麼不適用,相較於傳統尋路方案,導航網格的優勢是:
‒ 對網格進行合併,減少網格數量,減少計算量,提升效率
‒ 利用三角形貼合不規則的地形,讓拐彎更自然
而帶來的缺點是:重構網格相當費時,耗費的時間和地圖的阻擋複雜度成正比
我們再來看《異星前哨》這個產品裡,產品的執行邏輯如下:
1、玩家會頻繁的擺放/拆除建築
2、地圖阻擋屬性因為建築變動而變更
3、開始重構導航網格,重新定位蟲子所在的三角網格
4、開始廢棄舊的尋路路徑,蟲子開始重新尋路
5、效能逐漸被拖垮
我們透過上述的例子會發現,導航網格這種地圖型別:
地形不規則、阻擋幾乎不變。
比如,一個MMORPG的副本,導航網格允許離線生成,相對較為靜止
但遺憾的是,在《異星前哨》這種即時戰略類遊戲中,情形剛好相反:
地形非常規則,阻擋頻繁變動。
無奈之下,資深程式設計師在一個月黑風高的加班之夜,撫摸著自己僅剩的幾縷頭髮,在報告PPT上寫道:放棄使用導航網格尋路,改用傳統網格尋路。
二、傳統網格演算法
傳統網格就是我們常說的A星演算法,對於做了多年開發的技術組來說幾乎輕車熟路
使用A星(A-star algorithm)演算法
當玩家擺放建築時,只需要更新該建築所佔網格的阻擋屬性,剩下的工作就由強大的A*演算法自行解決。
一般情況下,一次尋路所消耗的時間不足1毫秒。
新的尋路模組編碼工作結束後,專案再次開展了一次深度測試。
一路穩定執行,配合上GPU的最佳化,整體執行的FPS穩定在80。
直到蟲巢發生暴動。
數千只蟲子相互擁擠在路口,相互碰撞,大量蟲子被擠出原有尋路路線,他們很快開始重新尋路。
偏離路線的蟲子數量越來越多,FPS也急劇下降到了10。
顯然,單次尋路消耗時間雖然少,但也架不住數量的增加,最佳化尋路效率並不能從根本上解決問題。
技術組亮出第一把武器:多執行緒尋路
利用CPU多核優勢,成倍提升計算力,FPS明顯回升。
隨著蟲子數量的持續增加,FPS再次回落。
技術組亮出第二把武器:採用佇列來削峰
尋路佇列的本質,是把大量的尋路計算,分散到不同的幀上執行,設定一個合適的並行數量,將剩餘的尋路請求丟進快取等待,控制每一幀的計算量,利用時間消化掉所有的尋路請求,穩定FPS。
當碰到提交的尋路請求源源不斷的時候,自然會掉進快取佇列數量只增不減的黑洞。
所以技術組很快發現儘管幀數穩定了,但另一個問題愈加嚴重,出現了“成片蟲子原地呆滯”的現象
儘管對自信心打擊很大,但這裡的問題非常明確:
海量蟲子的併發尋路存在很大問題,必須解決!
三、選擇洋流圖方案
技術組重新回到第一步,分析產品的地圖需求,經過多次的討論,意外發現了一個突破口:
《異星前哨》蟲潮爆發時有一個特點,所有怪物的目的地只有1個,就是主基地。
基於這個特點,我們的目光逐漸轉移到了一個不常用的方案上:
使用“洋流圖尋路法”Flow Field Pathfinding
這個方案的特點:地圖上的每一個網格,都記錄了前進的方向,避免大範圍的遍歷計算。
蟲潮衝鋒的時候,目的地只有主基地,非常簡單粗暴,而且,玩家本身無法改變地形,玩家建造的建築物只產生阻擋,並不影響蟲潮的進攻路線。
所以,洋流圖在地圖生成的初期即可確定下來,無需在玩家遊戲過程中動態生成。
靜態生成,避免大範圍遍歷網格,簡直是量身定做
同時,技術組還考慮到:為了降低難度,避免蟲子分流,在生成洋流圖時最佳化了部分路線,使蟲子儘可能不會到處亂跑,更容易擠在一個小路口供玩家戰鬥。
另外,洋流圖還支援多層結構,可以支援更復雜的尋路機制,有更好的擴充性。
之後還會做更多最佳化,針對蟲群出現的位置,將蟲群看成一個整體,最佳化前進路線,重算洋流圖,讓蟲群的進攻看起來更加飽滿、有壓迫感。
蟲子滿載,CPU滿載,幀數穩定
上述就是《異星前哨》技術組對遊戲CPU效率最佳化的總結了,希望大家的CPU不會太熱。
關於遊戲:
《異星前哨》是一款融合即時戰略的國產科幻生存RTS,不同於傳統RTS遊戲,本作捨棄了PVP對戰,將核心玩法聚焦於生存模擬。玩家將成為探索外星的領導者,建立基地並抵禦外星蟲潮的攻勢。遊戲首創英雄體系融入核心玩法,每個英雄擁有專屬技能、兵種以及建築單位等;數萬蟲潮同屏效果震撼,可暫停和隨時存檔。誠邀各位體驗!
相關文章
- 藍洞力作《燃燒王座》首測今日開啟 重燃RTS熱血!
- DAPP燃燒挖礦系統開發技術分析APP
- War3+CR的集大成者 《燃燒王座》能否“開啟全新RTS時代”?
- FIl模式Defi模式燃燒代幣模式專案系統開發技術(成熟技術)模式
- IPPSWAP挖礦/燃燒IPP代幣系統開發技術詳情
- BNB代幣燃燒挖礦dapp系統開發技術詳情APP
- BNB代幣燃燒質押挖礦系統技術開發分析原理
- DAPP智慧合約燃燒代幣挖礦原始碼系統開發技術APP原始碼
- 區塊鏈代幣通縮燃燒挖礦系統開發(技術理念)區塊鏈
- BNB代幣燃燒挖礦系統開發DAPP技術分析原始碼搭建APP原始碼
- bitcoin: 何為燃燒地址
- BSC鏈代幣燃燒挖礦系統開發成熟技術丨功能分析
- Bsc通縮代幣燃燒模式開發技術丨馬蹄鏈代幣挖礦模式系統開發技術模式
- 燃燒吧!我的併發之魂–synchronizedsynchronized
- 燃燒吧!我的併發之魂--synchronizedsynchronized
- DAPP合約代幣燃燒挖礦系統開發丨智慧合約DAPP技術框架APP框架
- 異地技術團隊高效協作的經驗分享
- 使用CSS製作火焰燃燒動畫CSS動畫
- Solidity語言編寫丨BNB代幣燃燒挖礦系統開發技術丨BNB丨DefiSolid
- 一個故事看懂CPU的SIMD技術
- 現代 CPU 技術發展
- 是否一輩子僅靠技術生存
- 技術分享|SQL和 NoSQL資料庫之間的差異:MySQL(VS)MongoDB資料庫MySqlMongoDB
- 技術選型的藝術---湖北技術價值分享會
- 防守生存為主的另類RTS,Funcom推出新作《不屈者柯南》
- Android技術分享| 【你畫我猜】Android 快速實現Android
- BNB 燃燒代幣模式專案系統開發模式
- 技術管理之新晉總監生存指南
- 再談RTS(上):RTS的衰落
- 《雙城之戰》成美劇式動漫標杆,激燃打戲經費燃燒
- NFC技術與RFID技術有哪些異同點?
- 技術分享主幹
- 技術分享| HTTP 代理HTTP
- ?【JVM技術專區】「難點-核心-遺漏」TLAB記憶體分配+鎖的碰撞(技術串燒)!JVM記憶體
- 技術分享 | OceanBase 裡的 BUFFER 表
- 燒錢換流量業務模式燃燒殆盡 新氧能依靠金融換道超車嗎?模式
- [重慶思莊每日技術分享]-local_listener導致登入異常
- [重慶思莊每日技術分享]-ORA-16018 異常處理記錄