|
我已超过35岁了,但我依然是程序员,干的动,也相信以后依然干的动。
我12年硕士毕业,开始了我的程序员职业生涯,第一份工作是参与开发一款3D FPS游戏网页游戏,该款游戏可以说技术非常超前网页游戏大行其道的年代,它算是首款真正的3D FPS,打开网页便可以玩 CS,你能想象么?它的名字就是《创世XX》,估计很多人的学生时代都有玩过吧,暑假时全网实时在线可达 10w人,在2018年游戏正式停止运营,现在谈谈它的一些技术实现应该没有什么保密限制了。我是这款游戏的后台开发,在近10年之后回头看下当时的技术架构,也别有一番趣味:人和事值得缅怀,技术同样值得!
玩家场景描述
玩过fps游戏的应该比较清楚的
- 战斗外,商城枪支等充值购买,个人积分排名等信息,个人任务完成,个人装备仓库,活动,新手训练,军团系统;自建或加入PvP、PvE等模式房间开始战斗,进入天梯匹配自动开始战斗等
- 战斗内,PvP 个人竞技、爆破、团队竞技、生化等模式,PvE就是打怪闯关,玩的人不多
从体验来说,游戏产品细节上是比较糙的,毕竟都是没太多工作经验的年轻人开发的,但其实还蛮好玩的,我们在开发过程中没事也偶尔玩几局体验一下。
技术架构
- 前端:Adobe Flash,语言 ActionScript
- 后端:web框架 GlassFish,语言 Java,通信框架 XSocket,数据库 MongoDB
架构图(模块图):

游戏分服架构
StateServer,分区单点,完成战斗外的商城、房间等功能,用本地缓存加快登录后玩家数据的加载及数据更新,每个区服配备单独的MongoDB存储玩家数据
BattleServer,战斗内处理每局游戏玩家请求,并发高,与玩家浏览器直连,无持久化,战斗结束数据回传
MatchServer,跨区唯一,匹配玩家组局游戏后调度到BattleServer开启游戏,单进程单线程,收到请求后单线程处理,无需锁,效率很高
后台除了上面提到的几个框架,其他的都纯靠Java原生代码自己写,比如多服务通信,现在知道可以用RPC框架可以做到服务发现,当时都是通过xml配置手动维护机器地址,每次部署调整那叫一个惊心动魄。
整体架构在性能上有很多优化考虑,比如如何避免加锁,如何减少DB操作;但可用性上缺少考虑较少,服务存在单点,中间数据容易丢失;扩展性上,分服起到较好的战斗外并发分流,而战斗内可以扩展服务提升支持的战斗场数,而并发只存在于同局10人的范围内,完全可以通过线程独立进行无锁处理。
优秀实践
今天比较晚,这块内容先写到这,先抛一些可能的问题,如果文章热度高后续挨个介绍该款游戏的优秀实践。
- 相比简单的web应用,FPS游戏对实时性很高,并发也很高,技术上有哪些优化实践,如何玩锁的?
- 每个玩家的天梯积分随时都在变化,在全网全服上几千万的账号如何做到实时给出当前排名?
- 类似王者荣耀的匹配,创世的天梯匹配如何做的,有哪些算法考量?
- 为什么用MongoDB,以及玩家数据的存储方案是怎样的,遇到过哪些坑?
你们又有哪些想了解的也可以评论给我 |
|