青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

A*尋路算法以及優化

Algorithm

?????? A* 在地圖中兩點間找出一條路徑,如果存在至少一條路徑,在各種不同的算法中 A* 將找到最短路徑,而且相比之下算法速度快。 A* 是一種可控的算法,是一種啟發式搜索算法,也就是說算法本身不會盲目的搜索路徑,而是估計一個最佳的考察方向,進行搜索。

? ???? A* 尋路算法中,我們從起點開始,檢查相鄰方格的方式,向外擴展直到找到目標。

我們做如下操作開始搜索:

1. 從起點開始,并且把它作為待處理的第一個點存入一個 開啟列表 。開啟列表就像一張購物清單。盡管現在列表里只有一個元素,但以后就會多起來。你的路徑可能會通過它包含的方格,也可能不會。基本上,這是一個待檢查方格的列表。

2. 從開啟列表中取出一個代價最小的點

關于代價值的計算

F = G + H

這里:
??? * G =
從起點,沿著產生的路徑,移動到當前節點的移動耗費。
??? * H =
從網格上那個方格移動到終點的預估移動耗費。這經常被稱為啟發值

?

如果開啟列表為空則說明路徑沒有找到,結束搜索。如果取到這個節點,則將這個結點加入到 關閉列表 ,如果這個點是終點,則結束搜索。如果不是終點就把這個點作為當前點。

3. 按照八個方向查找與當前點相鄰的節點,如果是可以移動的點(尋找起點周圍所有可到達或者可通過的方格,跳過有墻,水,或其他無法通過地形的方格)

a. 如果新考核的點在 關閉列表 中,并且從當前點到達這個點的 G 值更小則

將這個點作為當前點的孩子節點

更新這個點的 G

更新這個點所有孩子節點的父節點指針、 G 值、 F

b. 如果新考核的點在 開啟列表中 ,并且從當前點到達這個點的 G 值更小則

將這個點作為當前點的孩子節點

更新這個點的 G

?c. 將這個點作為當前點的孩子節點,計算這個點的 G H F 值,將這個節點加入到 開啟列表 中。

?

4 .跳回第二步周而復始,直到 開啟列表 為空,或者將終點加入到 關閉列表

? 流程圖:

流程圖.JPG

算法優化:

? ? ?? 算法中消耗分析

1.???? 節點的內存分配與釋放

?

節點的內存分配與釋放非常頻繁,大規模搜索的時候通常需要數千個節點乃至上萬個節點。所以很有必要做內存管理。考慮用 placement new 來分配內存減少分配與釋放的開銷,但是需要在程序運行開始就事先分配好內存。每個節點大約 20 字節左右,正常的情況下一張稍大的地圖有 1500x1500 大小 2,250,000 格,那么最壞情況下,需要內存約 40,000k ,所以如果一開始就分配這么多內存是不現實的,所以只能限制一個內存分配極值,比如一次分配一兆,如果用完就結束搜索。但如果游戲一開始就分配 1 兆內存用于尋路,實際上有可能一直都不需要大規模搜索,所以最好有增長方式的內存管理。

另一個方案是每次分配一批節點所需內存,用完了再增長,分配粒度越大命中效果也會更好些。

?

2.???? 從開啟列表中取出一個代價最小的點

從開啟列表中取出一個代價最小的點需要比較并遍歷所有在開啟表中節點。優化的做法是在每次插入開啟表的時候都將節點插入在表的最前端,這樣每次從前端取就可以避免遍歷的開銷,但是分析證明,每次節點的值改變都需要重新排序,一次大循環中可能需要多次排序,而每次大循環只會取一次代價最小節點,所以這一次的遍歷相比開銷要比排序小的多。

3.???? 查找考核點是否在關閉列表

查找考察點是否在關閉或者開啟列表中都需要遍歷整張表,優化的辦法是選擇合適的數據結構。

相比使用 vector 插入和刪除的速度會很慢,但是訪問和遍歷的速度很快,但如果 vector 預先分配內存,內存命中會很高,訪問和遍歷也會更快,插入和刪除如果用 swap 也會相對較快。

使用 list 插入和刪除速度會很快,但是遍歷會很慢,內存命中也會比較差。如果算法中對表的插入比遍歷頻繁,可以考慮使用 list

經過測試發現,瓶頸在表的遍歷與搜索上, vector 無論有多快搜索速度都是線性的而且隨著節點的增加,遍歷時間也隨之線性增長,而 map 的查找速度是常數級的, Hash map 查找的時間復雜度為 O(1) ,即使用 STL map 也會有 O(log (n)) 比線性查找 O(n) 快很多, map 永遠是穩定的。

?

4.???? 如果已經存在在列表中并且當前 G 值最小則更新其 G 值和這個考核點所有的孩子節點的 G 值和父節點指針。

遍歷孩子節點需要遞規來完成搜索整棵樹,開銷在于函數調用,所以采用棧的方式來模擬遞規。

5.???? 查找考核點是否在開啟列表,如果在開啟列表則更新這個節點。

6.???? 函數調用帶來的開銷,所有檢測函數都做成內聯函數,封裝后的 A* 需要對外開放一個檢測函數指針,可以實現函數對象來做檢測函數,函數對象的可以內聯 operator 操作符。

?

A* 帶來的其他問題

A* 在最壞的情況下會廣度搜索地圖,花費很多時間才能找到終點,尤其是目標點為掩碼(即無論如何到達不了的終點),所以通常情況下要對尋路時間加以限制,但是限制時間短了可能找不到目標點,限制時間長了又可能影響游戲幀率,比如在在游戲 Mouse Hold 的情況下,尋路是頻繁進行的。一個經驗值是 20 毫秒,對有效的目標點搜索超過 20 毫秒都沒有找到有效的路徑就放棄搜索,找一個離目標最近的終點即可。

但是時間限制可能存在硬件不同而效果不同的問題,對于不同的 cpu 來說,相同的時間搜索的范圍會不一樣,另一個選擇是利用循環次數來限制。

對于目標點為掩碼的處理,與其讓 A* 進行超時搜索不如在開始設置目標點的時候就計算一個離目標點最近的可以到達的點。可以從目標點為中心一圈一圈向外搜索,直到搜索到一個可以到達的點(非掩碼 )為止,這比起直接用 A* 消耗要小的多。

?

算法的進一步改進

1.?????? 需要更快的速度

a.???? 改進數據結構

?????? 當前使用的是 STL map ,是使用紅黑樹來管理內存的而不是真正的 Hash Map ,如果改為 HashMap ,效率可能會再有一些改進。 ???

b. ?? 分時計算

如果需要更快速的得到路徑,需要分時計算。一開始就計算出一條快速路徑,可能只有幾步,只是一個大概的方向,然后讓角色開始按照這條路徑開始行進,與此同時繼續計算完整路徑。

2. ?? 需要更優的路徑

?????? 如果需要更優的路徑,可以做進一步對路徑進行修正,也就是在搜索好的路徑上面選取一個點為目標再次進行搜索,找到更短路徑。這也意味著運算時間更長,這時候就需要在性能和更好的效果上取一個平衡點。

posted on 2006-12-30 11:07 修一居士 閱讀(3779) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

統計

常用鏈接

留言簿(3)

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲第一黄色网| 91久久精品国产91性色tv| 欧美精品一区三区| 你懂的国产精品| 欧美成人精品一区二区三区| 免费视频亚洲| 欧美日韩国内自拍| 欧美性大战久久久久久久蜜臀 | 欧美大片在线观看一区| 欧美国产高潮xxxx1819| 欧美三级资源在线| 国产一区再线| 亚洲激情一区二区| 亚洲亚洲精品三区日韩精品在线视频 | 久久激情视频久久| 欧美成人午夜激情在线| 日韩亚洲在线| 久久都是精品| 欧美日韩国产首页在线观看| 国产麻豆91精品| 亚洲欧洲在线免费| 欧美综合国产| 亚洲黄色一区二区三区| 午夜精品视频一区| 欧美高清自拍一区| 国内精品一区二区| 一本色道久久精品| 久久综合久久美利坚合众国| 99综合在线| 毛片基地黄久久久久久天堂| 国产精品美女主播| 亚洲美女在线国产| 久久综合色8888| 亚洲永久免费av| 欧美日韩另类国产亚洲欧美一级| 国模私拍一区二区三区| 亚洲字幕一区二区| 亚洲人体大胆视频| 久久网站免费| 国内精品美女av在线播放| 欧美亚洲免费在线| 一区二区三区四区国产精品| 欧美激情麻豆| 亚洲激情女人| 欧美成人a∨高清免费观看| 亚洲欧美日韩一区在线观看| 欧美午夜在线视频| 亚洲无限av看| 一区二区三区日韩精品| 欧美bbbxxxxx| 久久gogo国模啪啪人体图| 欧美国产免费| 国产亚洲欧美日韩精品| 亚洲一区3d动漫同人无遮挡| 亚洲高清一区二区三区| 久久久久久久久久久久久9999| 国产精品乱码人人做人人爱| 一本色道久久综合| 亚洲毛片在线看| 欧美福利电影网| 亚洲激情一区二区三区| 免费不卡视频| 久久三级福利| 亚洲第一中文字幕| 欧美成年视频| 欧美aⅴ99久久黑人专区| 91久久国产精品91久久性色| 欧美激情五月| 欧美日韩成人免费| 99热在这里有精品免费| 91久久香蕉国产日韩欧美9色| 欧美xx69| 亚洲性感美女99在线| 亚洲免费观看高清完整版在线观看| 欧美激情一区二区三区蜜桃视频| 99精品视频免费全部在线| 一本色道久久综合精品竹菊 | 国产一区二区三区观看| 欧美伊人精品成人久久综合97| 亚洲欧美国产制服动漫| 国产亚洲福利社区一区| 老司机精品视频网站| 免费91麻豆精品国产自产在线观看| 激情综合色丁香一区二区| 你懂的网址国产 欧美| 欧美国产三区| 欧美亚洲视频| 米奇777超碰欧美日韩亚洲| 一本色道88久久加勒比精品| 午夜日本精品| 日韩一级成人av| 午夜精品电影| 亚洲日本中文字幕| 亚洲素人一区二区| 亚洲国产成人av在线 | 另类天堂av| 亚洲一区二区三区高清不卡| 久久成人一区二区| 在线一区二区三区四区五区| 性欧美video另类hd性玩具| 91久久综合| 欧美亚洲一区二区三区| 亚洲免费高清| 久久精品亚洲一区二区三区浴池 | 一本一本久久a久久精品综合妖精| 一区二区三区国产在线观看| 国内成人精品2018免费看| 国产乱码精品一区二区三区五月婷| 欧美天天在线| 久久天堂成人| 欧美视频在线看| 久久亚洲一区二区| 国产精品狼人久久影院观看方式| 欧美a级片网| 国产欧美一区二区精品秋霞影院| 亚洲国产精品视频一区| 国产一区二区成人| 一区二区三区**美女毛片 | 亚洲欧美亚洲| 欧美日韩国产a| 欧美成人dvd在线视频| 国产日韩欧美高清| 一本在线高清不卡dvd| 亚洲精品国产精品国自产观看浪潮 | 久久成人18免费网站| 欧美母乳在线| 91久久精品国产91久久性色tv | 亚洲欧洲一区| 久久免费精品日本久久中文字幕| 欧美一区二区黄色| 欧美午夜精品久久久久久超碰| 欧美成人一区二区三区片免费| 国产欧美精品一区| 在线中文字幕一区| 中日韩视频在线观看| 欧美日韩国产一中文字不卡| 亚洲国产精品一区制服丝袜| 亚洲第一精品福利| 久久青青草原一区二区| 免费在线看成人av| 在线日韩精品视频| 男男成人高潮片免费网站| 亚洲电影在线播放| 99v久久综合狠狠综合久久| 欧美屁股在线| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 99在线精品视频在线观看| 欧美精品福利| 一区二区电影免费观看| 午夜精品视频一区| 国产性色一区二区| 久久久福利视频| 欧美高清在线| 亚洲视频网站在线观看| 国产精品欧美久久久久无广告| 香蕉久久夜色| 亚洲第一视频| 亚洲在线国产日韩欧美| 国产亚洲欧美另类中文| 蜜臀av一级做a爰片久久| 亚洲精品乱码久久久久久蜜桃91| 亚洲乱码国产乱码精品精98午夜| 欧美日韩综合一区| 香港久久久电影| 欧美激情视频免费观看| 亚洲欧美视频在线| 亚洲国产欧美精品| 国产精品久久久久久久久果冻传媒| 9l国产精品久久久久麻豆| 亚洲精品视频免费观看| 亚洲免费在线视频| 黄色成人免费观看| 老司机aⅴ在线精品导航| 日韩视频在线观看一区二区| 欧美专区在线观看| 亚洲免费成人av| 国产三级精品三级| 欧美精品国产| 欧美在线网址| 亚洲精品视频在线看| 久久久久久夜| 亚洲少妇在线| 亚洲黄网站黄| 国产一区二区三区精品欧美日韩一区二区三区 | 一区二区三区在线观看视频 | 亚洲狠狠婷婷| 国产日韩精品久久久| 欧美电影免费观看高清完整版| 亚洲一区二区日本| 亚洲精品久久久久久下一站| 久久久综合视频| 午夜精品成人在线视频| 日韩视频在线观看免费| 国内精品视频在线观看| 国产精品私拍pans大尺度在线 | 亚洲黄色影院| 欧美国产亚洲精品久久久8v| 久久精品国产一区二区三| 亚洲视频福利| 亚洲精品影视|