不看后悔!揭秘游戲服務(wù)器開發(fā)
前言
《摩爾莊園》前段時(shí)間上線, 持續(xù)超出市場預(yù)期,相信也有不錯(cuò)的收益。游戲好玩,所有玩家看到了前端,但是做一款游戲,離不開后臺(tái)游戲服務(wù)器的支持,服務(wù)器都要做什么,服務(wù)器的架構(gòu)是什么,需要哪些技術(shù),一系列的問題有沒有思考過?下面講下作為做服務(wù)器開發(fā)中需要做的事。
1、常見游戲模塊
游戲玩法
游戲開發(fā)中常見的玩法模塊,一般的游戲都會(huì)包含這些玩法
新手引導(dǎo)、任務(wù)系統(tǒng)、背包系統(tǒng)、裝備系統(tǒng)、副本、戰(zhàn)斗系統(tǒng)、活動(dòng)、商店、充值,競技場,公會(huì)系統(tǒng),好友系統(tǒng)、聊天系統(tǒng)、郵件系統(tǒng)、紅點(diǎn)系統(tǒng)等等
通用模塊
- 定時(shí)job,處理一些定期活動(dòng)重置,排名發(fā)獎(jiǎng)勵(lì)等
- 登錄,頂號,離線,斷線重連處理
- 敏感詞檢測,版署需要
- 日志系統(tǒng),記錄玩家行為日志,獎(jiǎng)勵(lì)日志等
- 功能開啟關(guān)閉,有時(shí)候游戲出問題后(比如刷獎(jiǎng)勵(lì))指定功能需要及時(shí)關(guān)閉
- 掉落,獎(jiǎng)勵(lì)隨機(jī)規(guī)則
- 防沉迷系統(tǒng),主要是未成年人保護(hù)規(guī)則
- 聊天監(jiān)控,
- 錯(cuò)誤上報(bào)機(jī)制
- 道具卡兌換,邀請碼
- 夏令時(shí)問題處理
- 不停服熱更線上代碼
- 緊急下家運(yùn)營活動(dòng)
- 合服
運(yùn)營后臺(tái)管理系統(tǒng)
- 發(fā)布下架活動(dòng)
- 發(fā)布公告
- 發(fā)送郵件
- 游戲資源凍結(jié)
- 賬號封號,解封,禁言
- 查詢當(dāng)前在線人數(shù)
2、開發(fā)語言與項(xiàng)目構(gòu)建發(fā)布
一般游戲服務(wù)器使用C++,nodejs,photon, JAVA等語言開發(fā),端游戲一般選擇C++,因?yàn)槎擞螌Ψ?wù)器的性能要求相對比較高一些,語言各有利弊,C++效率高,但是掌握度難些,JAVA易于掌握,開發(fā)效率搞,目前對于追求快速上線率的頁游和手游來說,JAVA成了一個(gè)不錯(cuò)的選擇,下面主要以JAVA項(xiàng)目來講述服務(wù)器各模塊之間如何交互,如何分工合作。項(xiàng)目采用maven框架構(gòu)建,簡化了項(xiàng)目依賴管理, jar包便于與持續(xù)集成工具(jenkins)整合一鍵打包發(fā)布svn,一般地,游戲服務(wù)器的架構(gòu)劃分如下三層:網(wǎng)絡(luò)接入層、游戲邏輯層、數(shù)據(jù)存儲(chǔ)層
網(wǎng)絡(luò)接入層
通信方面使用Netty框架,主要封裝各種物理底層通訊機(jī)制,讓應(yīng)用程序員關(guān)注業(yè)務(wù)邏輯。協(xié)議數(shù)據(jù)使用protobuff, Protobuf有更高的消息壓縮率,時(shí)間效率和空間效率都有很大的提升,支持多語言,跨平臺(tái)
數(shù)據(jù)緩存以及存儲(chǔ)
市面用的游戲用到的數(shù)據(jù)庫大多是下面這幾種:
MySQL,MongoDB, Redis
游戲服務(wù)器都配備了數(shù)據(jù)庫,是因?yàn)橛螒蛟絹碓綇?fù)雜,數(shù)據(jù)量也越來越多,而且采用數(shù)據(jù)庫也方便對數(shù)據(jù)的管理和備份。mysql主要存儲(chǔ)一些游戲中玩家數(shù)據(jù),redis主要存儲(chǔ)一些跨服數(shù)據(jù),比如跨服排行榜數(shù)據(jù)實(shí)時(shí)排名,或者數(shù)據(jù)的緩存。
游戲中玩家數(shù)據(jù)需要及時(shí)響應(yīng),及時(shí)反饋,一般游戲中絕大部分的數(shù)據(jù)是有緩存的,游戲中玩家產(chǎn)生的數(shù)據(jù)變化,一般先修改玩家緩存數(shù)據(jù),一定時(shí)間后,緩存數(shù)據(jù)定時(shí)批量寫入數(shù)據(jù)庫,長期使用不到的緩存將會(huì)被清理,減少內(nèi)存空間使用。
游戲邏輯層
服務(wù)器各類模塊介紹 :
| 模塊名 | 功能類型 | 功能說明 |
|---|---|---|
| yyds-all | maven父功能 | 管理模塊關(guān)系,maven的一些配置 |
| yyds-core | 公共模塊 | 游戲業(yè)務(wù)無關(guān)的公共代碼。 |
| yyds-common | 基礎(chǔ)模塊 | 游戲業(yè)務(wù)相關(guān)的公共代碼。 |
| yyds-game | 游戲服 | 處理游戲業(yè)務(wù)邏輯(游戲和聊天業(yè)務(wù),聊天消息通過網(wǎng)關(guān)進(jìn)行轉(zhuǎn)發(fā)) |
| yyds-gate | 網(wǎng)關(guān)服 | 負(fù)責(zé)維護(hù)客戶端連接,轉(zhuǎn)發(fā)消息。 |
| yyds-scene | 場景服 | 處理地圖相關(guān)業(yè)務(wù)(移動(dòng)、視野同步) |
| yyds-web | WEB服 | 登錄、創(chuàng)角、充值、GM命令、運(yùn)營后臺(tái)操作入口。 |
| yyds-platform | 跨服 | 游戲服之間的消息中轉(zhuǎn),跨服類玩法。 |
| yyds-fighter | 戰(zhàn)斗服 | 處理戰(zhàn)斗邏輯 |
服務(wù)器架構(gòu) :

注:platform 和多個(gè)游戲服相連接。
流程說明:
登陸流程:玩家登陸時(shí)首先連接web服,進(jìn)行登陸,驗(yàn)證成功后,會(huì)將玩家登陸的token 放到Gate服。然后玩家連接Gate服登陸到Game服。
戰(zhàn)斗流程:玩家在Game服發(fā)起戰(zhàn)斗,比如匹配戰(zhàn)斗,則在Game服上匹配,然后送入Fighter 戰(zhàn)斗服進(jìn)行戰(zhàn)斗,此時(shí)所有的戰(zhàn)斗消息從Gate服直接路由到Fighter服,戰(zhàn)斗結(jié)果發(fā)送給Game服,然后進(jìn)行發(fā)獎(jiǎng)等邏輯
玩家移動(dòng)流程:玩家移動(dòng)消息同步給Scene服,Scene服每一幀同步給所有的玩家
3、JAVA游戲服務(wù)器,需要掌握的技術(shù)
- Java基礎(chǔ)知識
- JavaNIO編程
- 多線程編程,并發(fā)集合的掌握,游戲中有很多并發(fā)事件,安全性尤為重要
- 熱更新,內(nèi)存,CPU性能分析
- Netty,Mina網(wǎng)絡(luò)框架精通一種
- Redis,memcache,MongoDB等單用或者組合使用
- SQL語言,數(shù)據(jù)庫:如mysql
- 數(shù)據(jù)庫操作,比如mybatis,Hibernate
- spring,springMvc主要用于http協(xié)議的WEB服務(wù)器
- tomcat,Nginx
- Linux常用的基本命令及shell腳本(服務(wù)器發(fā)布,啟動(dòng)關(guān)閉)
4、總結(jié)
游戲服務(wù)器因?yàn)樾枰嫦蛩械耐婕?,所以對服?wù)器的穩(wěn)定性要求比較高,不能總是出現(xiàn)問題,需要在開發(fā)中細(xì)心。
策劃的設(shè)計(jì)經(jīng)常天馬行空,所以也要考慮到服務(wù)器的功能擴(kuò)展性,爭取在盡量少寫代碼的情況下完成功能。
服務(wù)端程序的開發(fā)速度很重要,需要考慮模塊的通用性,功能的擴(kuò)展性,盡量的降低bug可能性,合理設(shè)計(jì)。
服務(wù)端同學(xué)任重道遠(yuǎn),需要不斷的學(xué)習(xí)和積累經(jīng)驗(yàn),才能做好游戲的支撐。
加油吧,希望各位同學(xué)做出自己喜歡的游戲,這篇文章就到這里了,希望能幫到你,請多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java實(shí)現(xiàn)斗地主與猜數(shù)字游戲詳細(xì)流程
這篇文章主要介紹了怎么用Java來寫斗地主種洗牌和發(fā)牌的功能,以及猜數(shù)字的游戲,斗地主相信大家都知道,同時(shí)也知道每一局都要洗牌打亂順序再發(fā)牌,本篇我們就來實(shí)現(xiàn)它們能,感興趣的朋友跟隨文章往下看看吧2022-04-04
Spring中基于Java的配置@Configuration和@Bean用法詳解
這篇文章主要介紹了Spring中基于Java的配置@Configuration和@Bean用法詳解,Spring中為了減少xml中配置,可以聲明一個(gè)配置類(例如SpringConfig)來對bean進(jìn)行配置。,需要的朋友可以參考下2019-06-06
Java采用setAsciiStream方法檢索數(shù)據(jù)庫指定內(nèi)容實(shí)例解析
這篇文章主要介紹了Java采用setAsciiStream方法檢索數(shù)據(jù)庫指定內(nèi)容,是比較實(shí)用的功能,需要的朋友可以參考下2014-08-08
java實(shí)現(xiàn)基于UDP協(xié)議網(wǎng)絡(luò)Socket編程(C/S通信)
這篇文章主要介紹了java實(shí)現(xiàn)基于UDP協(xié)議網(wǎng)絡(luò)Socket編程(C/S通信),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Java使用poi實(shí)現(xiàn)excel的導(dǎo)入操作指南
使用Apache Poi是一種流行且廣泛使用的方式,可以幫助開發(fā)人員直接從Java代碼中讀取、寫入和處理Excel文件,因此在這篇文章我們將著重介紹如何實(shí)現(xiàn)excel的導(dǎo)入,感興趣的朋友可以跟著小編一起來學(xué)習(xí)2023-06-06
SpringBoot項(xiàng)目中使用騰訊云發(fā)送短信的實(shí)現(xiàn)
本文主要介紹了SpringBoot項(xiàng)目中使用騰訊云發(fā)送短信的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Java實(shí)戰(zhàn)之王者榮耀的英雄是怎么產(chǎn)生的?
這篇文章主要介紹了Java實(shí)戰(zhàn)之王者榮耀的英雄是怎么產(chǎn)生的?文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05

