Demo说明
- '此项目仅为个人兴趣而写的模仿皇室战争的简易Demo,共分为四个项目,分别是herol、herolclient、herolpvp和herolrouter,其中herolclient项目为swing写的简易客户端模拟'
项目架构
从游戏服务器开发者的角度,我们可以看到,《皇室战争》同《部落冲突》一样,是一种全球同服的游戏,拿起手机,我们就可以和全世界任意一个国家、任意一个民族的人进行三分钟的战斗,在核心战斗部分,我们的整个战斗过程是实时同步的,玩家所放的每一个英雄,每一个技能,在双方的屏幕中,都能实时准确的出现,英雄之间进行战斗时的各种属性也是需要通过服务器进行实时同步的。
功能分析
游戏以匹配系统和实时战斗系统为整个游戏的核心,但同时游戏中也有卡牌养成系统,宝箱系统等除核心战斗系统之外的其他模块。由于《皇室战争》的整个系统还是非常庞大的,所以这里只写了一个简易版的系统,并且只有服务器端代码,客户端代码通过Java Swing来模拟。 通过对游戏功能模块的总结,可得出以下功能模块图
服务器部署架构
通过以上的功能模块,我们可以大致将其分为三个服务器系统:登录服务器(账号系统)、逻辑服务器(个人信息、英雄卡牌系统、宝箱系统)和对战服务器(战斗系统),玩家登录时由登录服务器负责接入用户连接,然后给玩家分配逻辑服务器,如果要进入对战场景,再通过逻辑服务器获取到对战服务器的信息,因此三个服务器的部署架构关系如下图
系统架构
通过对《皇室战争》的分析,我们可以将整个游戏分为客户端、应用服务与数据三个分层,客户端负责前端逻辑处理以及与服务器数据交互、应用服务层为游戏的逻辑处理服务、数据层游戏的数据进行缓存或持久化。下面从几个方面对系统技术架构进行分析:
-
通信机制 根据《皇室战争》的特点分析,它在战斗部分属于1V1的实时战斗,这部分需要使用TCP通信以保证数据的实时性,而其他模块功能,如升级英雄、打开宝箱等,对实时性的要求相对较低,可以使用短连接Http通信,以减少服务器的压力,Http服务器与TCP服务器均采用Netty5进行实现。而登录服务器、逻辑服务器与对战服务器之间通信,可以选择轻量的Rpc框架Json-Rpc,将服务器按场景划分能降低场景之间的耦合度,具有更好的可扩展性与可维护性。
-
数据处理 玩家的数据相对是比较独立的部分,玩家与玩家相互之间的数据几乎没有什么关联性,并且玩家数据有比较良好的结构性,因此选择MongoDB的BSON数据格式进行玩家数据的存储是一个比较好的选择,而对于游戏中交互较为频繁的热数据,我们也需要使用Redis数据库来进行存储,两者配合使用,能对服务器数据更好的处理。Redis的数据访问采用Java API——Jedis,MongoDB的数据访问采用Morphia,Morphia是一款类似Hibernate的ORM框架,它能使得MongoDB的开发更加容易。
-
项目管理 项目中用到了大量的第三方库,使用Maven管理项目的依赖包,以及项目的编译、发布、打包等,使得项目管理更加容易,同时多个框架也可以使用Spring来进行整合。
数据持久化方案
《皇室战争》的游戏数据相对来说是比较简单的,因为它主要核心就是实时PVP,更加注重的PVP的实时性,而不是个人养成模块,因此对于这款游戏来说,我们其实只要做好玩家个人数据的存储就好了,玩家进入游戏我们就把数据库中玩家的数据加载到内存或分布式缓存中,玩家操作游戏数据时,可以按照一定的策略定时或定量存库,至于PVP中读取的数据,都是进入实时对战场景就加载好的。 在对游戏的数据分析之后可以发现,多个玩家之前的数据之前没有什么关联性,而玩家自己的数据之前也具有很强的结构性,我们对玩家的数据分析之后可以得出如下结构
项目说明
服务端项目采用Maven项目搭建,模拟客户端采用Java Swing编写
herolrouter
登录服务器,主要负责以下处理:
- 游戏的登录接入,以及登录验证
- 服务器管理
- 支付订单处理
herol
逻辑服务器,主要负责处理游戏中除战斗以外的逻辑,这部分是通过Netty实现的HTTP服务器
herolpvp
战斗服务器,主要负责游戏的匹配及战斗数据处理,由于只是简单demo,所以我没有把匹配单独分出来一个服务器,就直接写在了战斗服务器中。
herolclient
游戏模拟客户端,通过Java Swing实现的简单的客户端模拟,主要原理是通过点击和输入两种交互方式,通过HTTP或TCP连接与服务器进行数据交互
服务器启动方式
- herorouter,herol和heropvp都是maven构建的项目,启动可以通过将其target目录下的war包部署到tomcat,heroclient是swing项目,其class目录下有打包好的jar,可直接启动。
- 启动herolrouter
- 启动herol
- 启动herolpvp
- 使用heroclient进行玩家操作模拟
写在结尾
本人目前从事Java游戏服务器开发相关工作,本项目仅为个人兴趣研究,与原游戏《皇室战争》没有任何关系,有兴趣的朋友欢迎交流想法。
- 个人博客:http://hjcenry.github.io
- 微信:hjcenry
- QQ:359583129