游戲戰斗服隨記
一 . 常規跨服玩法對服務(wù)器的需求
? 服務(wù)器的需求:負載均衡,固定路由算法,rpc
-
異步消息中間件
-
中轉服務(wù)器
-
gof(直連)
二 . 戰斗玩法對服務(wù)器的需求
服務(wù)器的戰斗選擇:幀同步和狀態(tài)同步都可以實(shí)現雷神的戰斗,選擇幀同步是為了更高效。
戰斗跳過(guò),戰斗回放,戰斗觀(guān)戰,這種需求在實(shí)現上客戶(hù)端和服務(wù)器的戰斗部分最好是一套代碼,但是客戶(hù)端需要表現和邏輯分離,所以代碼實(shí)現上客戶(hù)端寫(xiě)戰斗更適合。
狀態(tài)同步:
- 戰斗跳過(guò)等需求,單機客戶(hù)端跑,多人實(shí)時(shí)戰斗服務(wù)器跑。
- 雷神同屏的英雄數基本都超過(guò)10個(gè)甚至超過(guò)30個(gè),絕大部分都是跑ai,服務(wù)器運算ai部分需要更多的資源,每次心跳需要的時(shí)間會(huì )比較長(cháng),同步狀態(tài)會(huì )有延遲,同一時(shí)間點(diǎn)多個(gè)客戶(hù)端看見(jiàn)的動(dòng)作效果完全一致略有難度。
幀同步:
-
天然支持戰斗回放,跳過(guò),快進(jìn),觀(guān)戰
-
在同步問(wèn)題上有更大的優(yōu)勢
-
客戶(hù)端和服務(wù)器端一套代碼,開(kāi)發(fā)效率高,推進(jìn)速度快
-
雷神同屏英雄多,但是操作少,省流量
類(lèi)幀同步:
- 玩蟹現有的游戲一拳,拳皇,英雄學(xué)院類(lèi)型的游戲,戰斗和傳統的回合游戲比較類(lèi)似,戰斗中存在戰斗等待,多人玩法按照回合走,只需要控制好回合收集指令就可以。但是雷神游戲是及時(shí)的,不能有戰斗等待,所以需要用幀號來(lái)記錄出手技能和順序。
三. 幀同步實(shí)踐
-
網(wǎng)絡(luò )部分使用了公司現在有的方案kcp
-
服務(wù)器4核 16g 1500人kcp初步壓力測試沒(méi)問(wèn)題,服務(wù)器承載仍有較大的空間【內存res 1.5g,cpu100左右,load(3~7)】
四. 戰斗驗證技術(shù)方案
-
C#服務(wù)器--->C#戰斗代碼
-
java--->jni--->mono--->C#戰斗代碼
-
java--->jni--->.netcore--->C#戰斗代碼(集團的方案比較成熟)
五. 戰斗驗證服務(wù)器方案
- 戰斗驗證分優(yōu)先級:
-
緩存隊列:根據戰斗的優(yōu)先級分為同步隊列和異步隊列,隊列預設長(cháng)度,超過(guò)隊列長(cháng)度時(shí),同步隊列收到的協(xié)議按驗證超時(shí)處理,直接返回,異步隊列直接丟棄
-
同步驗證:優(yōu)先級高,驗證時(shí)間有超時(shí)限制,驗證結果需及時(shí)返回,通常是客戶(hù)端進(jìn)入戰斗前就需要知道戰斗結果。驗證前需要檢查一下在隊列中等待的時(shí)間,如果已經(jīng)超時(shí),不驗證,直接按照驗證超時(shí)處理。當前主要是競技場(chǎng)玩法
-
異步驗證:優(yōu)先級低,驗證沒(méi)有超時(shí)限制,玩家正常都能通過(guò)的戰斗,戰斗結束不需要等待驗證結果,臨時(shí)相信客戶(hù)端,直接發(fā)獎。異步隊列緩存戰斗消息,線(xiàn)程拿不到同步戰斗時(shí),開(kāi)始拿異步戰斗,戰斗驗證結果和預期結果不一致時(shí),通知游戲服務(wù)器玩家作弊
- 戰斗驗證效率
- 普通的pve,主線(xiàn),競技場(chǎng)玩法,戰斗基本上50~120ms左右跑完
- 大戰場(chǎng)GVE,30個(gè)英雄一個(gè)boss,戰斗時(shí)長(cháng)10分鐘,驗證時(shí)長(cháng)約3s
- 對于多人玩法pvp,gve,戰場(chǎng)英雄數量多,本身戰斗時(shí)間特別長(cháng),不適合戰斗驗證服務(wù)器去驗證,通過(guò)抽幀對比和戰斗結果對比的方式驗證
六. gof修改
在odin的基礎上redis和mongo引入了異步方案
-
jedis 換成 lettuce,天然支持集群,性能提升1倍左右
-
mongo同步驅動(dòng)換成異步驅動(dòng),性能上提升20%左右,雖然性能上沒(méi)有太大的提升,原有基礎上可以節省一步序列化和反序列化
七 . vms和global
公司原有的php版本的vms和global換成java版本,本亮后面會(huì )持續的維護和升級,滿(mǎn)足后面的項目組使用
-
vms單點(diǎn)壓測試: 內網(wǎng)機4c 16g 單臺vms的qps建議為1200為參考點(diǎn)
-
global單點(diǎn)壓力測試:
內網(wǎng)機4c16g,mongo 8g
無(wú)sdk校驗時(shí),qps建議為800-900為參考點(diǎn)
有sdk校驗(異步延遲20-50ms),qps建議為400為參考點(diǎn)
八 . 服務(wù)器結構圖
九 . 當前服務(wù)器框架的問(wèn)題以及需要改進(jìn)的地方
問(wèn)題:
- 幀同步服務(wù)器和戰斗驗證服務(wù)器需要部署好多臺,只能按照最大需求開(kāi)起,平時(shí)利用率低,但是卻不能隨便減少
改進(jìn):
-
線(xiàn)上集群節點(diǎn)增減對有狀態(tài)的業(yè)務(wù)有一定的影響,需要想辦法規避。
-
弱網(wǎng)問(wèn)題后面需要處理一下
