遊戲中物品的同步

2021-08-30 21:05:52 字數 1288 閱讀 1489

以在揹包、倉庫中操作物品為例

維護到乙份**看到如下的流程:

假設現在我在揹包中把物品從a格仔移動到b鴿子

已經有的關鍵字:

物品型別:普通,特殊,消耗。。。等等

放入函式:使用物品型別掩碼判斷

(1,2表示步驟)

c1:從落點範圍判斷是否合法(比如揹包格仔是1-20,倉庫是40-60)。如果滿足,傳送要移動的包給伺服器。這時候ui不做更新,即不執行實際的更新函式

s1:收到包進行校驗,比如是否能存放,如果是裝備則如何如何(放入函式)。同步計算完後,傳送確認包給c

c2:收到後執行實際的更換操作,更新(放入函式)

維護的需求如下,任務物品不能放入倉庫,並且給玩家提示。兩套方案

1:維持舊的結構,放的時候發乙個包,靠伺服器返回的乙個包來說明是否可以放入。後來發現交換協議包中沒有這個成功的字段

2:不發包。伺服器的校驗直接返回,客戶端做本地判斷,條件不符合就不發包。比較彆扭的地方來。如果不發包,那麼伺服器就不會發確認包,沒法執行客戶端的實際"放入函式"。所以只好在c1的座標中判斷這個物品來自**,然後直接操作。

另人感到很不快的是,為什麼要通過落點判斷呢?物品本身不是有物品型別的設定嗎?只要在容器和物品間設定好掩碼不就行了?現在就好比有兩套的資源結構,又可以落點判斷,又可以物品實際屬性判斷。

想起以前工作中碰到的物品操作流程:

c1:本地做乙份操作(實際操作),成功後發給伺服器乙份通知資訊,滑鼠鎖定

s1:收到後做乙份同樣操作,發乙個解鎖命令

c2:解鎖

這兩套方案中,我本來還比較排斥第二種,現在反而喜歡了。操作物品的時候最本質的需求是兩邊要同步,

從**維護上來說:

一號方案是讓伺服器先做,然後自己再做。如果是這樣那中間就無所謂在判斷是否合法了。但是一些基本的判斷你又不得不做。

二號方案中是直接做,也不要預判斷什麼。因為一件物品是否能放入,怎麼放入,這兩個邏輯應該是內聚在一起的。比如通過掩碼的方式。然後通過乙個解鎖命令來同步。如果再通過一些額外的點範圍判斷,實在是費解

很多人會說鎖會不會影響了操作?其實一樣的,一號方案也要在等待服務包的更新通知。(不知道大家有沒在遊戲中拿起一件物品放乙個位置,卡住的時候老放不下。)重要的本質是什麼,是同步。即使你這個時候讓玩家繼續操作(影響到他剛才移物品的),也是無效的。而在實際的表現過程中,網路順暢時(60-120ms響應),0.15-0.2秒很快就解掉鎖了。

寫到這,想起其實可以對一號方案進行改進,c1中直接進行乙個放入的步驟預判斷,如果成功發訊息請求。伺服器成功後傳送確認,c1再執行最終的放入。還是一分為二的做法。這樣的**你敢重用嗎?

遊戲中的網路同步

在網路遊戲中遊戲資料和狀態的同步是整個遊戲的基礎,而遊戲中對網路同步要求最高的就是戰鬥狀態的同步,它影響玩家的遊戲體驗。同時,不同型別遊戲的戰鬥狀態同步對網路同步要求又不一樣,所以產生了不同的網路同步機制。網路是有延時的,因為每個玩家的網路情況都不盡相同,而且每個玩家機器效能也不盡相同,這還會導致遊...

遊戲中幀同步與狀態同步

幀同步 什麼是幀同步 幀同步常被rts 即時戰略 遊戲常採用。在遊戲中同步的是玩家的操作指令,操作指令包含當前的幀索引。一般的流程是客戶端上傳操作到伺服器,伺服器收到後並不計算遊戲行為,而是 到所有客戶端。這裡最重要的概念就是 相同的輸入 相同的時機 相同的輸出。實現幀同步的流程一般是 同步隨機數種...

實現滑鼠與遊戲的互動(與遊戲中的物品互動)

我們這裡用到的是射線中的滑鼠螢幕射線 screenpointtoray 射線 ray ray new ray position startposition,position endposition 返回滑鼠座標 input,mouseposition 以上部分可參考開發者文件 拿到滑鼠在螢幕的射線 ...