可擴展性
有這種情況的優化的幾種方法。首先,你可能不必分裂成多個遊戲框架。在某種程度上,可伸縮性似乎是問題。 100個單位至少比1個單位貴100倍。
那麼,我們如何才能使路徑更適合可伸縮性?那麼,這取決於你的遊戲設計。我會(可能錯誤地)假設一個典型的RTS場景。幾組單位,每組相對較近。許多靠近的單位的路徑解決方案將非常相似。這些單位可以請求從某種解決方法路徑。該路徑求解器可以保留最近的路徑請求及其解決方案的表格,並避免多次計算來自相同輸入的相同輸出。這叫做memoization。
此外,另一個可能涉及到使您的網格或圖形的層次結構。首先解決更簡單的圖形,然後切換到更詳細的圖形。如果高分辨率路徑太多以至於無法合理記憶,則多個單元可以使用相同的低分辨率路徑,以利用記憶,但是每個單元都會分別計算它們自己的高分辨率路徑。
多幀計算
至於試圖計算幀之間的分裂,也有我能想到手的幾種方法。
如果要採用多線程路由,可以使用工作線程池模型。每次單元請求路徑時,它都會排隊尋找解決方案。當工作線程空閒時,它被分配一個任務來解決。當線程解決任務時,您可以通過回調來通知單元,或者您可以讓單元查詢任務是否以某種方式完成,最有可能查詢每個幀。
如果沒有動態障礙物或它們分開處理,則可以使路徑求解程序使用的常數狀態。如果沒有,那麼將會有不可忽視的複雜性,甚至可能聽到這些線程鎖定可變的遊戲狀態信息。從一幀到下一幀,路徑可能無效,需要重新驗證每一幀。多線程可能最終成爲毫無意義的額外開銷,由於鎖定和同步,線程很少會並行運行。這只是一種可能性。
或者,您可以設計您的路徑查找算法以分立步驟運行。經過n個步驟後,檢查自算法開始以來經過的時間量。如果超過一定的時間,則路徑算法會保存其進度並返回。然後調用代碼可以檢查算法是否完成。在下一幀中,從原來的位置恢復路徑算法。重複,直到解決。即使使用單線程自願方法來解決路徑問題,如果遊戲狀態的變化影響幀之間路徑的有效性,那麼您將遇到不得不重新驗證幀上當前的解決方案的情況以框架爲基礎。
使用部分解決方案
不管是用上述兩種方法,你可能會遇到的單位問題命令有一個完整的尋路解決方案之前去的地方空轉多幀。在典型情況下,這可能是可以接受的,而且幾乎檢測不到。如果不是,您可以嘗試按原樣使用不完整的解決方案。如果每個不完整的解決方案差異過大,單位會表現得相當猶豫不決。在實踐中,這種「猶豫不決」可能也不會引起關注。
什麼是您的A *搜索,網格?你考慮過使用A *作爲「本地搜索」嗎? – user7116
我從來沒有聽說過這種方法,但是我剛纔想到的另一種方法是加速網格的分辨率,以便降低網格的分辨率,以便在找到路徑之前沒有太多的節點要遍歷。您可以改進分辨率,並在實體遍歷時在路徑上進行某種迭代平滑。 –
六,請問您有什麼更具體的請指出您的意思是「具有里程碑意義」,我是一個新的路徑發現,所以我不知道所有的行話和這樣的:)。 Merlyn非常感謝您的回覆,但我認爲這不會很好地處理我的地形。 –