对于一款网络游戏,服务器开发是不可或缺的一部分。游戏服务器主要负责的是游戏联网的那一部分。那么游戏服务器到底解决哪些问题呢?总体来说,主要有以下三个方面。
第一,移动设备与服务器之间的点对点网络通信
移动设备从登录游戏开始,就必须跟游戏服务器之间建立连接,这部分称为网关。从客户端发送消息到服务器,到服务器推送消息到客户端。这里所说的消息,对于网络通信来说,其实就是一些字节流,就像水管里的流水一样,数据间没有间隙,没有首尾。对于游戏服务器来说,必须人为来规定怎样才算一个完整的消息帧,这部分每个游戏项目的定义一般都不完全一样,所以也叫做私有协议栈,一般都包含消息头以及消息体。
对于消息体来说,服务器与客户端之间可以选择的数据编解码方式比较多,例如json,xml,或者protobuf均可,只需通信双方编解码规则一致即可。
第二,游戏规则配置及业务逻辑处理
游戏服务器开发人员需要将游戏策划人员定义的游戏规则翻译成计算机能够理解的代码。对于一个完整的游戏服务器项目,由于整体的游戏架构都已经成型稳定了,业务开发才是大部分服务器开发人员的日常工作。业务逻辑是服务器代码最错综复杂的组成部分了,由于游戏本身的开发迭代周期比较短,以及游戏业务的复杂性,业务逻辑也是经常出现bug的。
一个游戏功能,不仅有业务规则,也有数据规则。数据规则可以说是数值策划与服务器开发人员沟通的桥梁了。服务器开发人员通过一些自定义的配置格式,以表格的方式(通常是excel)暴露给策划同学。例如玩家每升一级需要多少经验值,额外提高多少属性,这些都需要配置数据。
第三,玩家数据落地
网络游戏相对于单机游戏来说,数据的持久化方式是完全不一样的。单机游戏的程序与数据是保存在同一个设备上,通常是放在同一个安装目录下。如果设备损坏或更换,数据将面临丢失风险(当然,专业人员可以选择性迁移数据文件达到数据恢复的目的)。
网络游戏的数据主要存在于游戏服务器上(客户端设备也有小量数据保存,类似浏览器的本地保存),即使玩家更换游戏设备,只要登录同一个游戏服,数据都会自动恢复。
游戏服务器将玩家数据保存在数据库里,一般选择关系型数据库mysql,非关系型数据库MongoDB、Redis等。