在遊戲開發中,遊戲揹包是一個很是重要的功能,遊戲服務器揹包設計是的很是重要的,它要防止一些bug。幾乎每一個複雜點的遊戲都會有揹包的功能。不論是手遊戲仍是網頁遊戲,不論是SLG遊戲,仍是ARPG遊戲,揹包是必不可少的。揹包的功能根據策劃的要求,有的簡單,有的複雜。如下咱們就討論一下幾種遊戲服務器揹包設計與開發的實現。html
1,簡單的遊戲揹包設計算法
簡單的遊戲揹包到底簡單到什麼程度呢?那麼這個遊戲揹包只是用來存放物品,不須要記錄物品在揹包中的位置,只須要記錄物品的id和物品的數量便可。這樣的遊戲揹包設計起來很是方便,在數據庫中一個物品佔一行便可,例如:數據庫
當得到物品的時候,先查看這個物品是否已存在,若是不存在,則建立一個物品的對象,並插入到數據庫,若是這個物品對象已存在,則只須要更新物品的數量便可。而在客戶端顯示的時候,是否可疊加,疊加上限是多少,由客戶端本身去計算就能夠了。使用物品的時候,只須要更新相應的數量便可。另一個要求是要檢測揹包是否滿了,咱們只須要在初始化揹包的時候記錄一下揹包的最大格子數和已使用的格子數就能夠了。若是得到的物品在揹包中不存在或疊加數已滿,且沒有剩餘的格子則返回揹包已滿的提示。json
再複雜一些的揹包是,有一些特殊的物品,好比裝備,裝備通常都是能夠鑲嵌寶石的,這樣的話每一個裝備的id是不能相同的,即便是同一件名字同樣的裝備,它也要有一個惟一標識的id。這樣就須要咱們在放入物品的時候給物品生成一個惟一的id標識。生成惟一id的算法以前也介紹過,能夠參考:http://www.youxijishu.com/h-nd-147-0_35.html(遊戲服務器生成全局惟一ID的幾種方法)可是這些方法感受用在生成揹包物品惟一id上有點大材小用了。咱們再提供一個方法,以供參考:服務器
惟一id用一個long類型存儲,long類型有64位,咱們使用它的低32位存儲策劃配置的物品表中的物品id,高32用來記錄每得到一個物品就自增長1的序列order,即併發
Int itemBaseId = 10001;//配置表中的物品idspa
Int order = 1;//每得到一個物品這個序列自增長一,每一個遊戲揹包都有本身的order,這樣能夠減小併發對order的增長。設計
Long itemUid = (((long)order)<< 32) + (long)itemBaseId;htm
那麼這個order怎麼記錄呢?這個order不用記錄,那麼當玩家退出後再進入遊戲怎麼獲得這個order呢?咱們在玩家登錄時第一次初始化遊戲揹包時,只須要從每一個itemUid中拿出來每一個物品的order,而後比較一個,獲得最大的order作爲起始order便可。這樣能夠從一個itemBaseId中得到一個order:
Int order = itemUid >>> 32;
而那些能夠疊加,不須要惟一id的物品,只須要把它們的配置id轉化爲long存儲便可。
這樣在內存中,咱們能夠把全部的物品放入一個Hashmap中,得到新物品和使用物品也不用遍歷查找,速度很快。
更爲複雜的揹包,就是須要記錄物品在揹包中的位置索引。通常這樣的遊戲揹包都會帶物品的位置交換和整理功能。這種揹包麻煩的是那些能夠疊加的物品,由於同一個物品可能會佔多個格子,並且還不連續。
咱們還利用上面第二種揹包的惟一id方式,不過這裏會多增長一個物品在揹包中的位置索引,惟一id仍是long類型,而long是由:orderId + 位置索引 + 物品配置id組成。
好比:高25位爲order,中間10位爲位置索引(一個揹包有一千多個物品也差很少了),剩餘的29位存儲物品的配置id,這些位數能夠根據實際須要本身調整。
在內存中,咱們用一個數組來存儲全部的物品,每一個物品佔一個格子,數組索引即物品的位置索引。當獲取一個新物品的時候,若是這個物品是不可疊加的,直接遍歷數組,找一個空位置,利用這個索引和order,物品的配置id組成一個惟一的id放入便可。若是這個物品是可疊加的,須要用數組的0索引到最大索引和物品配置id一一組成惟一id查找對應的物品對象,找到以後判斷是否疊加已達最大數,若是已達到,直接找個空格子放入,若是沒有達到,直接更新數量,更新完數理再判斷是否達到最大疊加數,若是達到了,須要把多餘的再佔一個格子。
在使用物品的時候,客戶端傳過來這個物品的惟一id,咱們就能拿到它的數組索引,直接操做便可。這裏還有個問題,就是在使用前可能須要判斷是否足夠,若是隻用一個數組的話,須要遍歷數組,計算這個物品的總數量。若是不想遍歷的話,能夠另外再加一個Hashmap,存儲一個可疊加物品的總數量,即key物品配置id,value爲當前這個物品的總數量。這樣判斷是否足夠的時候就能夠直接判斷了。
目前最多見的就是這三種類型的遊戲揹包了,我在網上還看到有的設計是一個物品要佔多個格子,這樣的揹包作的時候再考慮怎麼設計吧。
在遊戲揹包中,還可能遇到一種狀況,就是有些特殊物品,好比某個寶石,當把這個寶石鑲嵌到裝備上,會額外增長這個裝備的屬性加成。可是具體增長多少,是在獲取寶石的時候,根據必定算法隨機出來的,並且影響幾個屬性也是隨機的。通常來講一旦隨機以後,這些屬性加成就不會再變化了,也就是說不會再更新了。那麼在揹包中咱們就能夠增長一個字段,存儲這些數據,這些數據能夠是一個單獨的對象,而後序列化爲byte[]存儲到數據庫的blob中,但是把這個對象轉爲json直接到text中。
這樣就能夠任意添加多個屬性數據,而不用修改數據庫各代碼了。物品揹包就能夠統一管理了。
轉載請註明來自遊戲技術網:http://www.youxijishu.com