我所遭遇過的遊戲中間件--Kynapse

我所遭遇過的遊戲中間件--Kynapse算法

      Autodesk Kynapse遊戲中間件是一款面向遊戲開發、非玩家控制角色實時模擬的領先的人工智能解決方案。Kynapse具備先進的路徑查找功能,好比三維路徑查找、動態環境評估,並支持複雜地形中的羣體路徑查找。高效的製做工具包以及專爲簡便集成和自定義而設計的結構可幫助遊戲開發人員簡化建立頂級控制檯遊戲和 PC遊戲的過程。這項高性能的遊戲人工智能技術可以幫助遊戲開發者在複雜的地形中,模擬先進的動態三維自動尋路、環境感知與大規模羣體移動。其主要功能有:
    (1)實時三維自動尋路—使用面向遊戲內角色的通過驗證的算法,可以面向複雜地形的動態3D路徑查找,找到他們以智能方式圍繞大型三維動態環境的路徑。
    (2)路徑數據生成—自動化工具能夠幫助團隊評估其結果,生成同等級別的AI數據,無需手動添加標籤。
    (3)三維空間感知—遊戲內角色能夠在運行中,在動態環境中智能地定位自身。若是在三維空間路徑查找告訴角色怎樣從A到B,那麼動態3D感知就是要告訴角色B爲何是一個值得去的地方。所以,3D感知是建立複雜的、有吸引力角色的關鍵。
    (4)團隊協做—多角色遊戲中的角色可以相互交流並進行小組討論。多個NPC能夠智能地分工完成一件任務,如足球遊戲,CS射擊遊戲等。服務器

      以上文字是從Kynapse的官網和廣告手冊上扒下來的,不過如今找它的官網的話須要費點工夫,由於Autodesk已經再也不對Kynapse進行升級和維護了.他們目前主推的兩個與人工智能相關的中間件是navigation(導航)和cognition(認知).我我的的感受是Autodesk將Kynapse拆成兩部分,一個作尋路(navigation),另外一個作認知與決策(cognition).有點跑題了,這篇文章仍是要講Kynapse,文章的中心思想與以前那個Scaleform的差很少,"吐嘈".我的感受Kynapse這個中間件最大的特色是不夠成熟完善,使用起來有太多的問題太多的坑須要繞過去.下面將一一吐嘈:網絡

(1)Demo
      Kynapse的Demo是我碰到過的中間件中最麻煩的.它使用了一款遊戲引擎好像是Version.要想徹底熟悉它的DEMO非得將這個遊戲引擎弄清楚.記得當時我費了很大勁纔將它的Demo編譯出來,可沒跑幾天Version的版本過時了.並且要弄清楚Version引擎也不容易,因此看它的Demo代碼很麻煩.好在項目中對AI的需求只是尋路,因此它的DEMO我也不須要太細看.異步

(2)地形數據
      Kynapse的地形數據(.PathData文件)的生成不直觀,不是所見即所得,而且每次生成的時間較長。沒有一種工具直接修改PathData文件,爲其添加刪除路點,修改地形屬性。美術人員經過須要疊代屢次才能生成一個滿意的.PathData文件,效率低下。這一點向他們官方提過不少次,始終沒有解決.那怕在他們脫胎換骨的新版本Navigation中也沒有獲得解決.還有,Kynapse沒法支持美術生成一個只容許半徑在0.5米如下的角色才能經過的通路.
      尋路使用的地形數據爲路點和關聯組成,Kynapse生成的地形數據中,會出現若干個路點擠在一塊兒的狀況.這種狀況確實不應出現,並且出現了還沒辦法修改,只能將就.這個問題貌似在navigation有所改善.函數

(3)智能體的種種BUG
      AI是個有極大不肯定性的問題.很難保證每次尋路的正確性,總會出現一些難以重現的問題.我之因此以爲Kynapse不夠成熟,緣由就在這裏.
Kynapse中總體流程是:在場景中建立智能體Agent,設置Agent的目標位置,而後在每一幀中調用其接口函數think(),這時其狀態中會有該智能體當前的朝向,速度等信息,而後按照這些信息移動智能體.直到到達爲止.
      實際應用時種種問題紛紛而至,問其官方老是獲得種種扯皮的答覆,因而個人代碼裏充斥着大量特殊處理的代碼:
a. 
    智能體的到達不是真正的到達,這一距離能夠在其屬性中設置,這個不算是它的Bug,應該算潛規則.工具

    if (m_agentBehaviour == AB_GOTO &&
        m_pathFinder->HasArrived())
    {
        /*
        Kyanpse的智能體並不會在絕對到達目標點時,認爲Arrived。
        實際上當它的HasArrived()返回true時,智能體和目標點會
        有一小段距離。此時須要調用ExecuteOnDirectlyGo()
        */
        m_bDirectlyGo = true;
        ExecuteOnDirectlyGo(deltaTime);
        return;
    }


b.
      當智能體的目標位置設置到障礙物的OBB內部時,智能體會來回行走,而永遠到不了目標位置。應該是當設置目標位置在障礙物內部時,直接返回尋路失敗。這個問題給官方提出後,給解決了,但與之類似的下一個問題沒有解決.性能

c.人工智能

#ifdef BUG_HACK
    // 當智能體在一個障礙物旁邊,而目標位置在該障礙物內部,而且其距離小於智能體的
    // 到達距離(m_pathFinder->SetDistanceToTarget設置的)時,kynapse判斷爲尋路到達,
    // 智能體會走進障礙物內,爲解決這一BUG,添加以下代碼:
    if (s_pAISystem->IsPositionInObstacle(m_vTarget))
    {
        m_agentState = AS_ARRIVED;
        m_bFailedToFindPath = true;
        return;
    }
#endif

 

 

 

d.spa

#ifdef BUG_HACK
        /*
        有時智能體會變得無旋轉無平移,雖然它的尋路狀態爲:PATH_FOUND
        但它卻靜止在一個位置,這時須要給它一個最小的移動速度
        */
        else                                
        {
            // 只有移動
            m_fLinearSpeed = max(fTargetSpeed, m_fRotatingSpeed);
        }
#endif


e.設計

#ifdef BUG_HACK
        /*
        此時按照kynapse給的路線走,居然走進了不可行走區域
        */
        else
        {
            position = m_body.GetPosition() + oriVector*0.005f;
            if ( position是可行走位置 )
            {
                // 向前移動一小步距離;
            }
            else
            {
                // 此時爲死路,進不可進,退無可退,只得強行移動
                // 當出現死路時,由直接走向最終目標點改成走向當前目標點.
            }
        }
#endif

 

f.

      這是最常碰到的問題:智能體會在障礙物的一個邊或者尋路地形的邊界處來回走動,卡死在那裏,而找不到路。當時的狀況是,智能體獲得當前的think結果是旋轉180,而後當旋轉完成後獲得的think結果是再轉回去.此時就看到咱們的角色在那個點上一直不停地旋轉.

#ifdef BUG_HACK
    /*
    用於解決智能體出現兩個目標位置不停切換的BUG.
    當發生BLOCK時,強制使智能體移動到上一幀所獲得的目標位置
    */
    if (m_isBlock)
    {
        ExecuteOnBlock(deltaTime);
        return;
    }
#endif

 

 

 

總之,以上每個BUG_HACK都記錄着個人血淚史,我不知道浪費了多少時間在這些BUG_HACK上.

(4)尋路性能問題
      在一個較大的場景中,智能體從一點到另外一點進行尋路。若是兩點間無路徑可達時,尋路算法將會遍歷幾乎整個場景。這時的計算量很大,若是在一幀之中進行計算,將非常耗時;經過設置尋路算法的每幀處理的路點數目能夠解決單幀耗時過大的問題,可是這樣設置後,尋路算法須要更多的計算時間(比在單幀中計算要多花數倍的時間),一般須要不少幀才能獲得尋路結果。

(5)尋路同步問題
      這是個糾結了好久都沒有結果的問題.網絡遊戲的角色同步是個大問題.以前還一直在討論這個模塊放在客戶端合適,仍是放在服務器端合適.對於這種難解的問題,我是不想細說了.

(6)Kynapse異步處理
      Kynapse提供了異步處理功能,可是我依照DEMO寫了函數SetupAsync(),調用後卻發現沒法尋路了,設置的自由漫步智能體不動了。因爲對這個功能沒有太急迫的需求,因此我就沒再細查.

相關文章
相關標籤/搜索