不看後悔!揭秘遊戲服務器開發

前言

《摩爾莊園》前段時間上線, 持續超出市場預期,相信也有不錯的收益。遊戲好玩,所有玩傢看到瞭前端,但是做一款遊戲,離不開後臺遊戲服務器的支持,服務器都要做什麼,服務器的架構是什麼,需要哪些技術,一系列的問題有沒有思考過?下面講下作為做服務器開發中需要做的事。

1、常見遊戲模塊

遊戲玩法

遊戲開發中常見的玩法模塊,一般的遊戲都會包含這些玩法

新手引導、任務系統、背包系統、裝備系統、副本、戰鬥系統、活動、商店、充值,競技場,公會系統,好友系統、聊天系統、郵件系統、紅點系統等等

通用模塊

  1. 定時job,處理一些定期活動重置,排名發獎勵等
  2. 登錄,頂號,離線,斷線重連處理
  3. 敏感詞檢測,版署需要
  4. 日志系統,記錄玩傢行為日志,獎勵日志等
  5. 功能開啟關閉,有時候遊戲出問題後(比如刷獎勵)指定功能需要及時關閉
  6. 掉落,獎勵隨機規則
  7. 防沉迷系統,主要是未成年人保護規則
  8. 聊天監控,
  9. 錯誤上報機制
  10. 道具卡兌換,邀請碼
  11. 夏令時問題處理
  12. 不停服熱更線上代碼
  13. 緊急下傢運營活動
  14. 合服

運營後臺管理系統

  1. 發佈下架活動
  2. 發佈公告
  3. 發送郵件
  4. 遊戲資源凍結
  5. 賬號封號,解封,禁言
  6. 查詢當前在線人數

2、開發語言與項目構建發佈

一般遊戲服務器使用C++,nodejs,photon, JAVA等語言開發,端遊戲一般選擇C++,因為端遊對服務器的性能要求相對比較高一些,語言各有利弊,C++效率高,但是掌握度難些,JAVA易於掌握,開發效率搞,目前對於追求快速上線率的頁遊和手遊來說,JAVA成瞭一個不錯的選擇,下面主要以JAVA項目來講述服務器各模塊之間如何交互,如何分工合作。項目采用maven框架構建,簡化瞭項目依賴管理, jar包便於與持續集成工具(jenkins)整合一鍵打包發佈svn,一般地,遊戲服務器的架構劃分如下三層:網絡接入層、遊戲邏輯層、數據存儲層

網絡接入層

通信方面使用Netty框架,主要封裝各種物理底層通訊機制,讓應用程序員關註業務邏輯。協議數據使用protobuff, Protobuf有更高的消息壓縮率,時間效率和空間效率都有很大的提升,支持多語言,跨平臺

數據緩存以及存儲

市面用的遊戲用到的數據庫大多是下面這幾種:

MySQL,MongoDB, Redis

遊戲服務器都配備瞭數據庫,是因為遊戲越來越復雜,數據量也越來越多,而且采用數據庫也方便對數據的管理和備份。mysql主要存儲一些遊戲中玩傢數據,redis主要存儲一些跨服數據,比如跨服排行榜數據實時排名,或者數據的緩存。

遊戲中玩傢數據需要及時響應,及時反饋,一般遊戲中絕大部分的數據是有緩存的,遊戲中玩傢產生的數據變化,一般先修改玩傢緩存數據,一定時間後,緩存數據定時批量寫入數據庫,長期使用不到的緩存將會被清理,減少內存空間使用。

遊戲邏輯層

服務器各類模塊介紹 :

模塊名 功能類型 功能說明
yyds-all maven父功能 管理模塊關系,maven的一些配置
yyds-core 公共模塊 遊戲業務無關的公共代碼。
yyds-common 基礎模塊 遊戲業務相關的公共代碼。
yyds-game 遊戲服 處理遊戲業務邏輯(遊戲和聊天業務,聊天消息通過網關進行轉發)
yyds-gate 網關服 負責維護客戶端連接,轉發消息。
yyds-scene 場景服 處理地圖相關業務(移動、視野同步)
yyds-web WEB服 登錄、創角、充值、GM命令、運營後臺操作入口。
yyds-platform 跨服 遊戲服之間的消息中轉,跨服類玩法。
yyds-fighter 戰鬥服 處理戰鬥邏輯

服務器架構 :

註:platform 和多個遊戲服相連接。

流程說明:

登陸流程:玩傢登陸時首先連接web服,進行登陸,驗證成功後,會將玩傢登陸的token 放到Gate服。然後玩傢連接Gate服登陸到Game服。

戰鬥流程:玩傢在Game服發起戰鬥,比如匹配戰鬥,則在Game服上匹配,然後送入Fighter 戰鬥服進行戰鬥,此時所有的戰鬥消息從Gate服直接路由到Fighter服,戰鬥結果發送給Game服,然後進行發獎等邏輯

玩傢移動流程:玩傢移動消息同步給Scene服,Scene服每一幀同步給所有的玩傢

3、JAVA遊戲服務器,需要掌握的技術

  1. Java基礎知識
  2. JavaNIO編程
  3. 多線程編程,並發集合的掌握,遊戲中有很多並發事件,安全性尤為重要
  4. 熱更新,內存,CPU性能分析
  5. Netty,Mina網絡框架精通一種
  6. Redis,memcache,MongoDB等單用或者組合使用
  7. SQL語言,數據庫:如mysql
  8. 數據庫操作,比如mybatis,Hibernate
  9. spring,springMvc主要用於http協議的WEB服務器
  10. tomcat,Nginx
  11. Linux常用的基本命令及shell腳本(服務器發佈,啟動關閉)

4、總結

遊戲服務器因為需要面向所有的玩傢,所以對服務器的穩定性要求比較高,不能總是出現問題,需要在開發中細心。

策劃的設計經常天馬行空,所以也要考慮到服務器的功能擴展性,爭取在盡量少寫代碼的情況下完成功能。

服務端程序的開發速度很重要,需要考慮模塊的通用性,功能的擴展性,盡量的降低bug可能性,合理設計。

服務端同學任重道遠,需要不斷的學習和積累經驗,才能做好遊戲的支撐。

加油吧,希望各位同學做出自己喜歡的遊戲,這篇文章就到這裡瞭,希望能幫到你,請多多關註WalkonNet的更多內容!

推薦閱讀: