不看后悔!揭秘游戏服务器开发

时间:2021-08-03 20:00:58

前言

《摩尔庄园》前段时间上线, 持续超出市场预期,相信也有不错的收益。游戏好玩,所有玩家看到了前端,但是做一款游戏,离不开后台游戏服务器的支持,服务器都要做什么,服务器的架构是什么,需要哪些技术,一系列的问题有没有思考过?下面讲下作为做服务器开发中需要做的事。

 

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可能性,合理设计。

服务端同学任重道远,需要不断的学习和积累经验,才能做好游戏的支撑。

加油吧,希望各位同学做出自己喜欢的游戏,这篇文章就到这里了,希望能帮到你,请多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/perfect2011/article/details/117870153