建立接近最優的導航網格以及基於導航網格的尋路演算法

2021-05-25 11:36:00 字數 4327 閱讀 5280

一種接近最優的導航網格生成演算法以及基於導航網格的尋路演算法

a*

尋路、3d

環境中的尋路

提出背景:

長距離尋路會出現掉幀現象,為了提高尋路速度,並為

3d環境中的尋路方案提供基礎演算法實現。

目前狀況:由於

3d遊戲對幀率要求很高,而在遊戲中進行一次長距離的尋路可能要花費

8-10

幀的時間,在地圖複雜的情況下尋路時間甚至可能會更嚴重,而在這段時間,渲染迴圈會暫停渲染並等待尋路結果。會給玩家帶來不流暢的操作體驗。

特別是3d

遊戲中地圖比較複雜,地圖規模比較大,對於一張

600*600

的地圖,尋路的搜尋空間的節點數目有可能達到數十萬之多,這給傳統的

a*尋路演算法提出了挑戰,如果地圖比較複雜,直接在這些節點上直接尋路的時間可能會以秒來計算。

解決方案:

解決上述問題的方法,可以通過生成導航網格來減少尋路演算法的搜尋空間。這也是

3d世界中最常用的尋路解決方案。

常見的導航網格生成方法有兩種,一種是通過手工建立,這需要專門的人員很細心的花費一定的時間來建立。另外一種是通過程式來自動生成,不過稍微複雜一點。這次創新採用了自動生成導航網格的方法。可以通過我們自己的

astarexplore

工具,在不改變現有資源的情況下自動生成導航網格。

dk online

中楓林片區地圖為例,可通過節點

55616

個,如下圖:

上圖為一張

435*310

的地圖,可通過節點

55616個

通過我們自己的工具自動生成的導航網格

(不需要人工手動建立

),可通過尋路節點僅為

2238

個,生成演算法採用了

hertel-mehlhorn

演算法和3-2merging

演算法。

自動生成的導航網格。節點數為

2238個

生成結果顯示:可通過節點由原先的

55616

個節點合併成為了

2238

個節點。大大減少了尋路時的搜尋空間,為更快,更遠的路徑搜尋提供了可能性。

3d空間中的導航網格

a*

尋路優化:

1、記憶體優化:

尋路中,搜尋路徑耗費的時間並不是最主要的損耗,而是尋路開始時的記憶體重置,或者是記憶體的不斷分配和釋放。由於節點數目的減少,在尋路之前就建立了節點的陣列(只占用

100-200k

記憶體),使用乙個

bool

的一維陣列來標識這些節點是否被搜尋過,每次尋路結束之後只需重置這個

bool

陣列即可。

2、使用二叉堆優化

open

表:使用二叉堆可使最優的節點一直處於堆的頂部,而不用消耗太多的時間在對

open

表的排序上,或者遍歷

open

表查詢最優節點上。

一次中短距離尋路對比:

遊戲中實際距離如圖a到

b的距離。

掩碼尋路結果

導航網格尋路結果

掩碼尋路耗費時間

導航網格耗費時間

通過對比:一次中短距離的基於原始節點的尋路,尋路時間為

1.615ms

,遍歷節點數

284個。而一次基於導航網格的尋路,遍歷節點僅為

58個,尋路時間只有

0.0711

毫秒。

一次中距離尋路對比:

遊戲中實際距離如圖a到

b的距離。

掩碼尋路結果

導航網格尋路結果

通過對比:一次中距離的基於原始節點的尋路,尋路時間為

69ms

,遍歷節點數

8393

個。而一次基於導航網格的尋路,遍歷節點僅為

522個,尋路時間只有

0.38

毫秒。一次長距離的尋路對比:

遊戲中實際距離如圖a到

b的距離,尋了乙個對角長度。

掩碼尋路結果

導航網格尋路結果

通過對比:一次長距離的基於原始節點的尋路,尋路時間為

468ms

,遍歷節點數

46636

個。而基於導航網格的尋路,遍歷節點僅為

2198

個,尋路時間只有

1.604

毫秒。

擴充套件:

由於生成導航網格的演算法是完全基於

3d空間的多邊形,可將此演算法應用到場景麵片當中,生成基於實際場景的導航網格,從而可實現分層尋路。如下圖。

參考文獻:參考《

ai game programming wisdom

》中《建立接近最優的導航網格》文獻。

採用了hertel-mehlhorn

演算法和3-2merging

演算法建立接近最優的導航網格。

hertel-mehlhorn演算法

3-2merging演算法

尋路演算法仍然採用

a*演算法,但搜尋空間變成了導航網格。啟發函式的計算公式有所改變。

g

=

穿入邊中點與穿出邊中點的距離。

h

=

多邊形中點到目標點的直線距離。

f

= g

+ h

值。

COPY NAV導航網格尋路 光照射線法

上圖是乙個由任意凸多邊形構成的導航網格,白線包圍區域代表著不可進入的障礙區域,紅線包圍區域則可以進入或穿越。網格中所有多邊形的頂點儲存次序均為順時鐘序。在下面的討論中,我們的運算一概採用左手系進行。假設當前所處的位置為p0,視線方向向量為n0,p0位於多邊形a中,我們知道每一條邊的兩側的多邊形的編號...

導航欄的建立

導航欄的建立 1.2 新增css,讓原本縱排的列表,橫著排。1.3 新增css,設定a標籤樣式。設定a標籤為塊狀,內邊距 避免重疊在一起 2 較複雜的導航欄 2.2 對a標籤的更複雜設定,背景色 文字顏色 去下劃線 加分割線 2.3 滑鼠懸停效果 2.4 居中對齊文字,將行高 line height...

三種簡潔的Tab導航(網頁選項卡)簡析

在網頁中應用選項卡可以使網頁顯得更緊湊,結合ajax技術可以使頁面在有限的空間內展現更多的內容。本文主要介紹幾種簡潔的選項卡效果的實現 不涉及滑動門和ajax 附有例項,無,相容性較好,方便大家直接使用。第一種形式 通過更換顯示樣式實現,這種很常見,就不多說了。第二種形式 這種結構比較複雜一些,外面...