不看后悔!揭秘游戲服務器開發(fā)
前言
《摩爾莊園》前段時間上線, 持續(xù)超出市場預期,相信也有不錯的收益。游戲好玩,所有玩家看到了前端,但是做一款游戲,離不開后臺游戲服務器的支持,服務器都要做什么,服務器的架構是什么,需要哪些技術,一系列的問題有沒有思考過?下面講下作為做服務器開發(fā)中需要做的事。
1、常見游戲模塊
游戲玩法
游戲開發(fā)中常見的玩法模塊,一般的游戲都會包含這些玩法
新手引導、任務系統(tǒng)、背包系統(tǒng)、裝備系統(tǒng)、副本、戰(zhàn)斗系統(tǒng)、活動、商店、充值,競技場,公會系統(tǒng),好友系統(tǒng)、聊天系統(tǒng)、郵件系統(tǒng)、紅點系統(tǒng)等等
通用模塊
- 定時job,處理一些定期活動重置,排名發(fā)獎勵等
- 登錄,頂號,離線,斷線重連處理
- 敏感詞檢測,版署需要
- 日志系統(tǒng),記錄玩家行為日志,獎勵日志等
- 功能開啟關閉,有時候游戲出問題后(比如刷獎勵)指定功能需要及時關閉
- 掉落,獎勵隨機規(guī)則
- 防沉迷系統(tǒng),主要是未成年人保護規(guī)則
- 聊天監(jiān)控,
- 錯誤上報機制
- 道具卡兌換,邀請碼
- 夏令時問題處理
- 不停服熱更線上代碼
- 緊急下家運營活動
- 合服
運營后臺管理系統(tǒng)
- 發(fā)布下架活動
- 發(fā)布公告
- 發(fā)送郵件
- 游戲資源凍結
- 賬號封號,解封,禁言
- 查詢當前在線人數(shù)
2、開發(fā)語言與項目構建發(fā)布
一般游戲服務器使用C++,nodejs,photon, JAVA等語言開發(fā),端游戲一般選擇C++,因為端游對服務器的性能要求相對比較高一些,語言各有利弊,C++效率高,但是掌握度難些,JAVA易于掌握,開發(fā)效率搞,目前對于追求快速上線率的頁游和手游來說,JAVA成了一個不錯的選擇,下面主要以JAVA項目來講述服務器各模塊之間如何交互,如何分工合作。項目采用maven框架構建,簡化了項目依賴管理, jar包便于與持續(xù)集成工具(jenkins)整合一鍵打包發(fā)布svn,一般地,游戲服務器的架構劃分如下三層:網(wǎng)絡接入層、游戲邏輯層、數(shù)據(jù)存儲層
網(wǎng)絡接入層
通信方面使用Netty框架,主要封裝各種物理底層通訊機制,讓應用程序員關注業(yè)務邏輯。協(xié)議數(shù)據(jù)使用protobuff, Protobuf有更高的消息壓縮率,時間效率和空間效率都有很大的提升,支持多語言,跨平臺
數(shù)據(jù)緩存以及存儲
市面用的游戲用到的數(shù)據(jù)庫大多是下面這幾種:
MySQL,MongoDB, Redis
游戲服務器都配備了數(shù)據(jù)庫,是因為游戲越來越復雜,數(shù)據(jù)量也越來越多,而且采用數(shù)據(jù)庫也方便對數(shù)據(jù)的管理和備份。mysql主要存儲一些游戲中玩家數(shù)據(jù),redis主要存儲一些跨服數(shù)據(jù),比如跨服排行榜數(shù)據(jù)實時排名,或者數(shù)據(jù)的緩存。
游戲中玩家數(shù)據(jù)需要及時響應,及時反饋,一般游戲中絕大部分的數(shù)據(jù)是有緩存的,游戲中玩家產(chǎn)生的數(shù)據(jù)變化,一般先修改玩家緩存數(shù)據(jù),一定時間后,緩存數(shù)據(jù)定時批量寫入數(shù)據(jù)庫,長期使用不到的緩存將會被清理,減少內存空間使用。
游戲邏輯層
服務器各類模塊介紹 :
模塊名 | 功能類型 | 功能說明 |
---|---|---|
yyds-all | maven父功能 | 管理模塊關系,maven的一些配置 |
yyds-core | 公共模塊 | 游戲業(yè)務無關的公共代碼。 |
yyds-common | 基礎模塊 | 游戲業(yè)務相關的公共代碼。 |
yyds-game | 游戲服 | 處理游戲業(yè)務邏輯(游戲和聊天業(yè)務,聊天消息通過網(wǎng)關進行轉發(fā)) |
yyds-gate | 網(wǎng)關服 | 負責維護客戶端連接,轉發(fā)消息。 |
yyds-scene | 場景服 | 處理地圖相關業(yè)務(移動、視野同步) |
yyds-web | WEB服 | 登錄、創(chuàng)角、充值、GM命令、運營后臺操作入口。 |
yyds-platform | 跨服 | 游戲服之間的消息中轉,跨服類玩法。 |
yyds-fighter | 戰(zhàn)斗服 | 處理戰(zhàn)斗邏輯 |
服務器架構 :
注:platform 和多個游戲服相連接。
流程說明:
登陸流程:玩家登陸時首先連接web服,進行登陸,驗證成功后,會將玩家登陸的token 放到Gate服。然后玩家連接Gate服登陸到Game服。
戰(zhàn)斗流程:玩家在Game服發(fā)起戰(zhàn)斗,比如匹配戰(zhàn)斗,則在Game服上匹配,然后送入Fighter 戰(zhàn)斗服進行戰(zhàn)斗,此時所有的戰(zhàn)斗消息從Gate服直接路由到Fighter服,戰(zhàn)斗結果發(fā)送給Game服,然后進行發(fā)獎等邏輯
玩家移動流程:玩家移動消息同步給Scene服,Scene服每一幀同步給所有的玩家
3、JAVA游戲服務器,需要掌握的技術
- Java基礎知識
- JavaNIO編程
- 多線程編程,并發(fā)集合的掌握,游戲中有很多并發(fā)事件,安全性尤為重要
- 熱更新,內存,CPU性能分析
- Netty,Mina網(wǎng)絡框架精通一種
- Redis,memcache,MongoDB等單用或者組合使用
- SQL語言,數(shù)據(jù)庫:如mysql
- 數(shù)據(jù)庫操作,比如mybatis,Hibernate
- spring,springMvc主要用于http協(xié)議的WEB服務器
- tomcat,Nginx
- Linux常用的基本命令及shell腳本(服務器發(fā)布,啟動關閉)
4、總結
游戲服務器因為需要面向所有的玩家,所以對服務器的穩(wěn)定性要求比較高,不能總是出現(xiàn)問題,需要在開發(fā)中細心。
策劃的設計經(jīng)常天馬行空,所以也要考慮到服務器的功能擴展性,爭取在盡量少寫代碼的情況下完成功能。
服務端程序的開發(fā)速度很重要,需要考慮模塊的通用性,功能的擴展性,盡量的降低bug可能性,合理設計。
服務端同學任重道遠,需要不斷的學習和積累經(jīng)驗,才能做好游戲的支撐。
加油吧,希望各位同學做出自己喜歡的游戲,這篇文章就到這里了,希望能幫到你,請多多關注腳本之家的更多內容!
相關文章
如何解決java.util.zip.ZipFile解壓后被java占用問題
這篇文章主要介紹了如何解決java.util.zip.ZipFile解壓后被java占用問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06restemplate請求亂碼之content-encoding=“gzip“示例詳解
RestTemplate從Spring3.0開始支持的一個HTTP請求工具,它提供了常見的REST請求方案的模板,及一些通用的請求執(zhí)行方法 exchange 以及 execute,接下來通過本文給大家介紹restemplate請求亂碼之content-encoding=“gzip“,需要的朋友可以參考下2024-03-03spring 整合 mybatis 中數(shù)據(jù)源的幾種配置方式(總結篇)
因為spring 整合mybatis的過程中, 有好幾種整合方式,尤其是數(shù)據(jù)源那塊,經(jīng)??吹讲灰粯拥呐渲梅绞?,總感覺有點亂,所以今天有空總結下,感興趣的朋友跟隨腳本之家小編一起學習吧2018-05-05