關於自動尋路和遊戲角色同步問題的具體設計

2021-06-08 04:37:08 字數 2125 閱讀 5921

1.      對於這樣一種情況:

每一次伺服器傳送給b的關於它們的網路玩家a的角色的移動事件資訊時,對於b而言,它們都不一定必須在接受到訊息的當前幀執行客戶端同步模擬的**。

這樣設計的原因是因為兩種原因:

(1)      當網路延遲嚴重時,b所接收到的關於a』的移動事件訊息可能已經過期(即不再是當前時間a』應該做出的處理,(從時間戳可以看出))這種時候我就應該從b客戶端中的a』角色所在移動同步事件佇列中,將該事件刪除,轉而將cpu資源用於處理更新更準確的移動事件。

(2)      當同屏過多的玩家角色同時移動的時刻,我可以優先處理距離b角色更近的網路玩家角色,並且優先處理在它的佇列中需求最高的事件。

因此,我們必須對每個網路角色物件的移動事件所在的佇列進行動態維護。

具體的維護方法可以如下:(abc 都是在客戶端x上顯示網路角色)

首先,為了使每個事件都能按照適合的需求被執行,我們採用權值的方式來線性的對每乙個移動事件進行處理。權值的大小,取決於4類不同的因數。

(1)      角色的權值:由角色是否能被我看見,距離我的遠近,角色的移動等待佇列中有多少個正在等待的事件等因素決定。

(2)      事件的權值:由事件的時間戳決定,如延遲了多久,當時間過期,直接刪除事件。

(3)      該角色是否在本幀中已經執行過一次移動事件,只能執行一次移動

(3)      對於所有的尋路事件,我都將根據該幀需要處理的個數來將其分別在2-5幀內完成(具體根據寫**的時候)。根據人體的神經反應時間,在0.2秒左右的誤差,玩家是無法區分的,因此分幀處理是完全不會對遊戲的表現效果產生影響。

總結:對於乙個需要城戰的遊戲,areainteresting 角色列表過於龐大,同一幀接受到數個角色的移動事件這種極端情況就會突然大幅降低客戶端的幀速,為了事這種情況下,客戶端不至於卡死,我們才得以採用此方法來維護。儘管演算法變複雜,但是能使同屏的角色數量大大增加。

2.      對於這樣一種情況:

當a執行一次尋路事件,並且已經被伺服器傳送到b上面,a』已經開始模擬該事件時,這個時候,a放棄了當前未完成的尋路事件,並執行新的尋路事件(a或者b),事件經由伺服器傳送到了b上,此時,b上面的a』所在的位置並不等於新的尋路事件的起點,因此,此時所接收到的尋路訊息中的節點資訊是無效的,為了使其有效,根據當前點和目標起點之間有無碰撞來決定是否由接收客戶端自行計算該網路角色的尋路點(將a變成d和c),使之和目標起點組成一串當前有效的尋路節點。

做這樣的設計,則需要維護乙個臨時進行a*尋路計算的需求佇列,原因如下:

(1)      避免同一幀進行多個a*尋路演算法,完全可以分成數幀來對該佇列進行分開處理。

(2)      分幀處理對於客戶端感官而言幾乎沒有影響。

3.      客戶端和伺服器之間通訊的資料結構

(1) 客戶端傳送到伺服器上的資料結構:send(curpos,nextnode1,nextnode2);

curpos: 當前的本地玩家角色a的位置

nextnode1:下乙個節點的位置

nextnode2:下下個節點的位置

(2) 伺服器收到send()後,打上當前的時間戳,再**給areainteresting中 有a的客戶端

(3) 其他客戶端收到伺服器發來的訊息:

receve(curpos,nextnode1,nextnode2,sendtime);

首先,得到本次移動和上一次移動之間的時間差,即該網路角色本次間隔模擬了多少時間了

t = sendtime – lastsendtime;

得到前一次收到資訊和本次收到資訊之間,該角色移動了多少距離s. 得到當前應該有的速度:

vt = s/   t *a;

a為係數,可調。

如果本次移動資訊因網路延遲被間隔了很久才傳送過來,那麼s必然會很大,而對於伺服器的發包時間差而言,不會因網路而影響。所以延遲的結果必然會導致vt變大,角色會加快速度來彌補位移。則可實現客戶端模擬

遊戲中尋路的問題研究

最近在做個小遊戲,塔防的 敵人的路徑最開始是用乙個unity論壇上找的貝茲爾曲線類 後來發現itween有個path外掛程式,可以專門做這個,而且不用自己寫編輯器了,就用了這個 讓敵人跟隨路徑前進,這是最簡單的辦法 原理 傳入乙個1 100的int,返回乙個在該百分比的目標點位置,如果角色到達目標點...

資料結構和演算法 自動尋路A 演算法實現

自動尋路a 演算法實現 include include include include 用於求起始點到終點距離,平方根函式 using namespace std const int kcost1 10 直移一格的消耗 每走一格的位置 const int kcost2 14 斜移乙個的消耗 本次不實...

問題 關於同步和非同步

同步非同步在程式設計的時候經常會用到,比如處理資源競爭的時候會用到 同步機制 來保證資源的有效性,在乙個程序中執行多個請求的時候用 非同步機制 來保證效率。今天在學習同步非同步的時候突然想到乙個問題,發個問題記錄貼等以後看。也許未來的自己會嘲笑現在的自己居然這麼sb 假設程序有程序a和程序b,他們各...