###一、游戲物品/道具系統(tǒng)數(shù)據(jù)模型設(shè)計(jì)特點(diǎn)
為了讓游戲更加的豐富,我們1201團(tuán)隊(duì)的新手機(jī)游戲設(shè)計(jì)了道具系統(tǒng)。于是豐富了游戲、取悅了玩家,哭了開(kāi)發(fā)——道具/物品數(shù)據(jù)子系統(tǒng)是簡(jiǎn)單的、復(fù)雜的、不確定的:
1. 簡(jiǎn)單,說(shuō)起來(lái)不就是選擇一個(gè)或多個(gè)數(shù)據(jù)庫(kù)產(chǎn)品,然后定義一種數(shù)據(jù)模型,然后增、刪、改、查。
2. 復(fù)雜,物品/道具可以在細(xì)分為裝備、時(shí)裝、坐騎、寶石、buff等等,每類(lèi)物品有不同的屬性需求,于是:
+ 首先物品數(shù)據(jù)是游戲核心數(shù)據(jù)里數(shù)據(jù)量最大、操作最頻繁、數(shù)據(jù)結(jié)構(gòu)最多元化的數(shù)據(jù)
+ 如果用一種數(shù)據(jù)表結(jié)構(gòu),那么會(huì)浪費(fèi)很多的字段或數(shù)據(jù)空間(而物品表超大);
+ 如果用不同的數(shù)據(jù)表結(jié)構(gòu),那么游戲邏輯就要麻煩一些了數(shù)據(jù)庫(kù)null和空的差別,比如物品在玩家中轉(zhuǎn)移的時(shí)候、修改、丟棄的時(shí)候。
+ 是否進(jìn)行應(yīng)用邏輯層水平切分?切分了就可以將數(shù)據(jù)庫(kù)分布到多個(gè)數(shù)據(jù)庫(kù)服務(wù)器上,那么理論上數(shù)據(jù)規(guī)模就不會(huì)成為瓶頸了;但如果切分了,道具數(shù)據(jù)分析、后期的合區(qū)邏輯就會(huì)很復(fù)雜。
+ 裝備、時(shí)裝是會(huì)有多個(gè)屬性的,且每件裝備的屬性值、屬性類(lèi)型都不一樣,如何設(shè)計(jì)數(shù)據(jù)字段(當(dāng)然如果用nosql數(shù)據(jù)庫(kù)就不存在這個(gè)問(wèn)題了)?
3. 不確定:
+ 隨著游戲開(kāi)發(fā)及運(yùn)營(yíng)的進(jìn)行,各種新的道具的需求會(huì)不斷涌現(xiàn)出來(lái),有可能就會(huì)需要增加新的屬性和功能需求
+ 到底每一個(gè)玩家最終會(huì)有多少的物品?
+ 最終單個(gè)區(qū)服的數(shù)據(jù)規(guī)模有多大這個(gè)其實(shí)很難預(yù)計(jì)。我們做的很完善(當(dāng)然開(kāi)發(fā)代價(jià)也大)的設(shè)計(jì)與開(kāi)發(fā)會(huì)不會(huì)有些多余,甚至被老板認(rèn)為想多了?
###二、游戲物品/道具系統(tǒng)數(shù)據(jù)模型設(shè)計(jì)目標(biāo)及解決思路
上面分析做了,槽也吐了數(shù)據(jù)庫(kù)null和空的差別,還是要做事嘛,呵呵。根據(jù)我們的新游戲的具體需求,對(duì)物品數(shù)據(jù)庫(kù)表的設(shè)計(jì)定義了如下要求和解決思路:
序號(hào) | 要求 | 解決思路
------| ----- | -----------------------------------
1| 確保數(shù)據(jù)操作的性能 | 充分利用緩存服務(wù)器
2| 降低程序開(kāi)發(fā)和后期客服工作的復(fù)雜度 | 各類(lèi)道具不分表
3| 必須可以方便、靈活的支持道具新功能需求的開(kāi)發(fā) | 將多變的裝備屬性以json格式存于一個(gè)字段
4| 保留充分的可擴(kuò)展性 | 根據(jù)玩家id進(jìn)行數(shù)據(jù)庫(kù)表水平切分
5| 盡量降低合區(qū)操作時(shí)數(shù)據(jù)處理邏輯的難度和效率 | 用自增長(zhǎng)ID、玩家id、區(qū)服id做聯(lián)合主鍵
###三、具體開(kāi)發(fā)設(shè)計(jì)方案
根據(jù)以上的分析結(jié)果,我們?cè)诳偨Y(jié)了以前的游戲開(kāi)發(fā)經(jīng)驗(yàn)并參考了網(wǎng)上的一些文章后形成了我們新手機(jī)游戲的物品數(shù)據(jù)子系統(tǒng)的設(shè)計(jì)、開(kāi)發(fā)方案。
*所有數(shù)據(jù)訪(fǎng)問(wèn)都封裝在model層。*
1. 在程序的model層里定義公共函數(shù)GetDb(,),用于物品數(shù)據(jù)及其它需要進(jìn)行按用戶(hù)水平分割的數(shù)據(jù)獲取數(shù)據(jù)庫(kù)(連接)
2. 每一個(gè)物品的主鍵由,,三個(gè)字段組成
3. 將裝備buff及某道具特有屬性統(tǒng)一以json字符串形式保存在一個(gè)字段里
4. 道具表定義 *失效時(shí)間* 字段,這個(gè)字段同時(shí)表示道具有效期的三種情況:
+ =0 ,表示是不限時(shí)的永久性道具
+ 小于等于,表示有效時(shí)間段,如雙倍經(jīng)驗(yàn)卡有效時(shí)長(zhǎng)3小時(shí),那么著個(gè)字段值為 **180** (分鐘),使用此道具時(shí),用當(dāng)前時(shí)間加上這個(gè)字段值得到失效時(shí)間戳修改此字段或做其他處理
+ 大于,表示該道具的失效時(shí)間戳(unix時(shí)間戳格式)
5. 玩家道具數(shù)據(jù)查詢(xún)流程:
+ 首先檢查redis里有沒(méi)有
+ 如果有,返回
+ 如果沒(méi)有從數(shù)據(jù)庫(kù)里查詢(xún)并存到redis,返回
6. 修改/或增加道具數(shù)據(jù)流程:
+ 首先檢查redis里有沒(méi)有
+ 如果沒(méi)有,從數(shù)據(jù)庫(kù)里查詢(xún)并存到redis
+ 如果有,繼續(xù)
+ 修改/增加redis數(shù)據(jù),同時(shí)在key為“”的redis list 數(shù)據(jù)里記錄下該道具的主鍵
+ 定時(shí)根據(jù)“”數(shù)據(jù)寫(xiě)回mysql,并清除“”
7. 刪除一個(gè)道具數(shù)據(jù)流程:
+ 在redis 里key為“” 的redis list 數(shù)據(jù)里記錄下該道具的主鍵
+ 刪除redis里記錄
+ 定時(shí)根據(jù)”數(shù)據(jù)刪除mysql里記錄,并清除“”
8.注意:
+ 配置redis 為 **在每次更新操作后進(jìn)行日志記錄**
+ 緩存定時(shí)同步mysql處理程序可以作為一個(gè)獨(dú)立的進(jìn)程運(yùn)行
+ 這個(gè)解決方案可以針對(duì)其它用戶(hù)私有數(shù)據(jù),如技能、buff。
###四、總結(jié)
數(shù)據(jù)庫(kù)表水平分割和緩存應(yīng)用基本上已經(jīng)是服務(wù)器端程序員的常識(shí),在上查相關(guān)技術(shù)資料時(shí),大多數(shù)博文也是寫(xiě)的這些。
本文先是對(duì)游戲道具/物品數(shù)據(jù)模型的進(jìn)行了簡(jiǎn)單的需求分析,然后講了思路和方案,其實(shí)我最想表達(dá)的是我的三個(gè)設(shè)計(jì)細(xì)節(jié)或idea:
+ 道具數(shù)據(jù)記錄主鍵設(shè)計(jì)(方便合區(qū))
+ 裝備buff及道具特有的屬性字段設(shè)計(jì)(為道具豐富的功能需求提供靈活、便捷的數(shù)據(jù)基礎(chǔ))
+ 所有道具類(lèi)別不區(qū)分存儲(chǔ)(方便后期的客服查詢(xún)和數(shù)據(jù)統(tǒng)計(jì))
友情鏈接: 餐飲加盟
地址:北京市海淀區(qū) 電話(huà):010- 郵箱:@126.com
備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有